DateTime ke tanggal javascript

98

Dari jawaban lain di Stackoverflow adalah konversi dari tanggal Javascript ke .net DateTime:

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

Tetapi bagaimana melakukan yang sebaliknya? DateTime ke Tanggal Javascript?

AJ.
sumber
Dalam pertanyaan seperti ini yang jelas terkait ajax, Anda harus menentukan di mana Anda melakukan konversi, dan mengingat tidak ada standar untuk serialisasi tanggal di JSON dan ada kemungkinan Anda berurusan dengan MS Date munging misalnya / Tanggal (02020202 ) Saya juga pastikan untuk menjelaskannya. semoga berhasil
Sky Sanders
2
Anda harus menautkan jawaban yang Anda maksud
cdmckay

Jawaban:

116

Mencoba:

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

Sunting: UTC sebenarnya lebih baik, tetapi kemudian kita harus konsisten

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

Meskipun, setelah dipikir-pikir itu tidak masalah, selama kedua tanggal tersebut berada di zona waktu yang sama.

AxelEckenberger
sumber
5
Anda mungkin ingin menggunakan DateTime.UtcNow daripada DateTime.Now
Matt Dearing
2
Mengenai pikiran kedua Anda: itu penting selama transisi ke atau dari waktu musim panas (saya selalu harus berpikir keras untuk mengingat yang mana :). Selama transisi, jam 2:00 hingga 3:00 diulang dua kali. Ini berarti bahwa selama satu jam tanggal javascript akan dimatikan satu jam. UTC tidak memiliki DLS jadi tidak ada masalah itu.
Sebastiaan L
Saya memiliki kode yang sama di sini tetapi membuat perbedaan 5:30 dalam tanggal javascript sementara tanggal C # berfungsi dengan baik.
Jenish Zinzuvadiya
44

JavaScript Date konstruktor menerima jumlah milidetik sejak periode Unix (1 Januari 1970 00:00:00 UTC). Berikut metode ekstensi C # yang mengubah objek .Net DateTime menjadi tanggal JavaScript:

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);
   }
}

Penggunaan JavaScript:

var dt = new Date(<%= DateTime.Today.ToJavaScriptMilliseconds() %>);
alert(dt);
Yair Nevet
sumber
C # penggunaan tanggal panjang = DateTimeJavaScript.ToJavaScriptMilliseconds (DateTime); periksa di javascript (Tekan F12 di Google Chrome dan buka konsol) var date = new Date (long); console.log (date.toString ());
Gonen09
24

Anda dapat mencoba ini dalam Tindakan Anda:

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

Dan ini dalam kesuksesan Ajax Anda:

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

Atau ini di Tampilan Anda: (Javascript plus C #)

var date = new Date('@DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")');
Renan Cerqueira
sumber
1
Mudah dan cepat untuk dipahami
FindOutIslamNow
jawaban terbaik untuk saya
Navid
23

Dengan Moment.js cukup gunakan:

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

Di mana netDateTimevariabel DateTime Anda diserialkan, seperti "/Date(1456956000000+0200)/".

Marco Lackovic
sumber
11

Ini harus melakukan trik:

date.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds
munissor
sumber
4

Saya tahu ini agak terlambat, tetapi inilah solusi yang harus saya pikirkan untuk menangani tanggal ketika Anda ingin menjadi independen zona waktu. Pada dasarnya ini melibatkan mengubah segalanya menjadi UTC.

Dari Javascript ke Server :

Kirimkan tanggal sebagai nilai waktu dengan offset zona waktu dihapus.

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) }
});

Server kemudian menerima 1420070400000 sebagai periode tanggal.

Di sisi Server, konversikan nilai epoch tersebut menjadi objek datetime:

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

Pada titik ini, tanggal hanyalah tanggal / waktu yang disediakan oleh pengguna seperti yang mereka berikan. Secara efektif ini adalah UTC.

Pergi ke arah lain :

Saat server menarik data dari database, mungkin dalam UTC, dapatkan perbedaannya sebagai epoch (pastikan bahwa kedua objek tanggal adalah lokal atau UTC):

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

atau

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

Saat javascript menerima nilai ini, buat objek tanggal baru. Namun, objek tanggal ini akan diasumsikan sebagai waktu lokal, jadi Anda perlu mengimbanginya dengan zona waktu saat ini:

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)

Sejauh yang saya tahu, ini harus berfungsi untuk zona waktu mana pun di mana Anda perlu menampilkan tanggal yang tidak bergantung pada zona waktu.

Kode Monyet
sumber
3

Metode ini berhasil untuk saya:

   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;
    }
alexey
sumber
1

Jika Anda menggunakan MVC dengan pisau cukur

----- Pisau cukur / 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: buat daftar di C # dan isi
  • 2: Buat array dalam javascript
  • 3: Gunakan pisau cukur untuk mengulang daftar
  • 4: Gunakan @: untuk beralih kembali ke js dan @ untuk beralih ke C #
  • 5: -1 dalam bulan untuk mengoreksi nomor bulan di js.

Semoga berhasil

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

Untuk mengubah tanggal ke tanggal JS (semua angka):

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

Jawaban terlambat lainnya, tetapi ini hilang di sini. Jika Anda ingin menangani konversi serial /Date(1425408717000)/dalam javascript, Anda cukup memanggil:

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

Sumber: amirsahib

Kajbo
sumber
Itu jawaban tapi, Yuck. Saya tidak merekomendasikannya. Dua peretasan tidak berhasil. Dan serialisasi Microsoft adalah peretasan yang tidak menyenangkan.
Suncat2000
@ Suncat2000 bagaimana hack ini? Jika Anda menggunakan layanan untuk mengambil nilai dari server ke front-end, saya tidak tahu alternatif yang lebih baik. Ini adalah solusi terbersih dari masalah di halaman ini. Jika Anda tahu alternatif yang lebih baik, mau tunjukkan kami contoh?
Kajbo