DateTime'dan javascript tarihine kadar


98

Stackoverflow'daki başka bir yanıt, Javascript tarihinden .net DateTime'a bir dönüşümdür:

long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript
return new DateTime(1970, 1, 1) + new TimeSpan(msSinceEpoch * 10000);

Ama tersi nasıl yapılır? Javascript DateTime?


Açıkça ajax ile ilgili olan bu gibi sorularda, dönüşümü nerede yaptığınızı belirtmelisiniz ve JSON'da tarih serileştirme için bir standart olmadığını ve MS Tarih işleme ile uğraşmanızın mümkün olduğunu göz önünde bulundurarak ör. / Tarih (02020202 ) / Bunu da netleştirdiğinizden emin olun. iyi şanslar
Sky Sanders

Yanıtlar:


116

Deneyin:

return DateTime.Now.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds

Düzenleme: gerçek UTC daha iyidir, ancak o zaman tutarlı olmamız gerekir

return DateTime.UtcNow
               .Subtract(new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc))
               .TotalMilliseconds;

Yine de, ikinci düşüncelerde, her iki tarih aynı saat diliminde olduğu sürece önemli değil.


5
DateTime.Now yerine DateTime.UtcNow kullanmak isteyebilirsiniz
Matt Dearing

2
İkinci düşüncelerinize gelince: Yaz saati uygulamasına geçişte veya bu saatten bu yana geçiş önemlidir (hangisi olduğunu her zaman hatırlamak için gerçekten zor düşünmek zorundayım :). Geçiş sırasında 2:00 - 3:00 saatleri iki kez tekrarlanır. Bu, bir saat boyunca javascript tarihinin bir saat gecikeceği anlamına gelir. UTC'nin DLS'si yoktur, bu nedenle bu sorunu yoktur.
Sebastiaan M

Burada da aynı koda sahibim ama javascript tarihinde 5:30 fark yaratırken C # tarihi iyi çalışıyor.
Jenish Zinzuvadiya

44

JavaScript Date kurucusu, Unix döneminden (1 Ocak 1970 00:00:00 UTC) bu yana geçen milisaniye sayısını kabul eder. Net DateTime nesnesini JavaScript tarihine dönüştüren C # uzantı yöntemi şöyledir:

public static class DateTimeJavaScript
{
   private static readonly long DatetimeMinTimeTicks =
      (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks;

   public static long ToJavaScriptMilliseconds(this DateTime dt)
   {
      return (long)((dt.ToUniversalTime().Ticks - DatetimeMinTimeTicks) / 10000);
   }
}

JavaScript Kullanımı:

var dt = new Date(<%= DateTime.Today.ToJavaScriptMilliseconds() %>);
alert(dt);

C # kullanım uzun tarih = DateTimeJavaScript.ToJavaScriptMilliseconds (DateTime); javascript'i kontrol edin (Google Chrome'da F12'ye basın ve konsola gidin) var date = new Date (uzun); console.log (date.toString ());
Gonen09

25

Bunu Eyleminizde deneyebilirsiniz:

return DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");

Ve bu, Ajax başarınızda:

success: function (resultDateString) {
    var date = new Date(resultDateString);
}

Veya Görünümünüzde şu: (Javascript artı C #)

var date = new Date('@DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")');

1
Kolay ve hızlı anlaşılması
FindOutIslamNow

benim için en iyi cevap
Navid

23

Moment.js ile şunu kullanın:

var jsDate = moment(netDateTime).toDate();

netDateTimeDateTime değişkeniniz nerede serileştirilir, örneğin "/Date(1456956000000+0200)/".


11

Bu hile yapmalı:

date.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds

4

Bunun biraz geç olduğunu biliyorum, ancak saat diliminden bağımsız olmak istediğinizde tarihleri ​​ele almak için bulmam gereken çözüm burada. Esasen her şeyi UTC'ye dönüştürmeyi içerir.

Javascript'ten Sunucuya :

Tarihleri, saat dilimi farkı kaldırılarak çağ değerleri olarak gönderin.

var d = new Date(2015,0,1) // Jan 1, 2015
// Ajax Request to server ...
$.ajax({
  url: '/target',
  params: { date: d.getTime() - (d.getTimezoneOffset() * 60 * 1000) }
});

Sunucu daha sonra tarih epoch olarak 1420070400000 alır.

Sunucu tarafında, bu epoch değerini bir datetime nesnesine dönüştürün:

DateTime d = new DateTime(1970, 1, 1, 0, 0, 0).AddMilliseconds(epoch);

Bu noktada tarih, kullanıcının sağladığı şekliyle yalnızca tarih / saattir. Etkili olarak UTC'dir.

Diğer tarafa gitmek :

Sunucu veri tabanından muhtemelen UTC olarak veri çektiğinde, farkı bir dönem olarak alın (her iki tarih nesnesinin de yerel veya UTC olduğundan emin olun):

long ms = (long)utcDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;

veya

long ms = (long)localDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local)).TotalMilliseconds;

JavaScript bu değeri aldığında, yeni bir tarih nesnesi oluşturun. Ancak, bu tarih nesnesinin yerel saat olduğu varsayılacaktır, bu nedenle onu geçerli saat dilimine göre kaydırmanız gerekir:

var epochValue = 1420070400000 // value pulled from server.
var utcDateVal = new Date(epochValue);
var actualDate = new Date(utcDateVal.getTime() + (utcDateVal.getTimezoneOffset() * 60 * 1000))

console.log(utcDateVal); // Wed Dec 31 2014 19:00:00 GMT-0500 (Eastern Standard Time)
console.log(actualDate); // Thu Jan 01 2015 00:00:00 GMT-0500 (Eastern Standard Time)

Bildiğim kadarıyla bu, saat diliminden bağımsız tarihleri ​​görüntülemeniz gereken her saat dilimi için çalışmalıdır.


3

Bu yöntem benim için çalışıyor:

   public sCdateToJsDate(cSDate: any): Date {
        // cSDate is '2017-01-24T14:14:55.807'
        var datestr = cSDate.toString();
        var dateAr = datestr.split('-');
        var year = parseInt(dateAr[0]);
        var month = parseInt(dateAr[1])-1;
        var day = parseInt(dateAr[2].substring(0, dateAr[2].indexOf("T")));
        var timestring = dateAr[2].substring(dateAr[2].indexOf("T") + 1);
        var timeAr = timestring.split(":");
        var hour = parseInt(timeAr[0]);
        var min = parseInt(timeAr[1]);
        var sek = parseInt(timeAr[2]);
        var date = new Date(year, month, day, hour, min, sek, 0);
        return date;
    }

1

MVC'yi ustura ile kullanıyorsanız

----- Jilet / C #

var dt1 = DateTime.Now.AddDays(14).Date;
    var dt2 = DateTime.Now.AddDays(18).Date;

    var lstDateTime = new List<DateTime>();
    lstDateTime.Add(dt1);
    lstDateTime.Add(dt2);

--- Javascript

$(function() {

            var arr = []; //javascript array

            @foreach (var item in lstDateTime)
             {
                @:arr1.push(new Date(@item.Year, @(item.Month - 1), @item.Day));
             }
  • 1: listeyi C # ile oluşturun ve doldurun
  • 2: JavaScript'te bir dizi oluşturun
  • 3: Listeyi yinelemek için jilet kullanın
  • 4: js'ye geri dönmek için @: ve C # 'a geçmek için @ kullanın
  • 5: js cinsinden ay numarasını düzeltmek için aydaki -1.

İyi şanslar


0
<input type="hidden" id="CDate" value="<%=DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")%>" />

Tarihi JS tarihine dönüştürmek için (tüm sayılar):

var JSDate = $("#CDate").val();
JSDate = Date.parse(JSDate);

0

Başka bir geç cevap, ama bu burada eksik. /Date(1425408717000)/Javascript'te serileştirilmiş dönüşümün üstesinden gelmek istiyorsanız , şunları arayabilirsiniz:

var cSharpDate = "/Date(1425408717000)/"
var jsDate = new Date(parseInt(cSharpDate.replace(/[^0-9 +]/g, '')));

Kaynak: amirsahib


Bu bir cevap ama Yuck. Ben tavsiye etmiyorum. İki saldırı bir doğru yapmaz. Ve Microsoft'un serileştirmesi tatsız bir hack.
Suncat2000

@ Suncat2000 bu hack nasıl? Sunucudan ön uca değer almak için bir hizmet kullanıyorsanız, daha iyi bir alternatif bilmiyorum. Bu, bu sayfadaki sorunun en temiz çözümüdür. Daha iyi bir alternatif biliyorsanız, bize örnek göstermek ister misiniz?
Kajbo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.