DateTime ถึงวันที่จาวาสคริปต์


99

จากคำตอบอื่นใน Stackoverflow คือการแปลงจากวันที่ Javascript เป็น. net DateTime:

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

แต่จะทำอย่างไรกลับกัน? DateTime ถึง Javascript Date?


ในคำถามเช่นนี้ที่เห็นได้ชัดว่าเกี่ยวข้องกับ ajax คุณควรระบุตำแหน่งที่คุณกำลังทำการแปลงและพิจารณาว่าไม่มีมาตรฐานสำหรับการจัดลำดับวันที่ใน JSON และเป็นไปได้ว่าคุณกำลังจัดการกับ MS Date munging เช่น / Date (02020202 ) / อย่าลืมทำให้ชัดเจนด้วย ขอให้โชคดี
Sky Sanders

2
คุณควรเชื่อมโยงคำตอบที่คุณอ้างถึง
cdmckay

คำตอบ:


118

ลอง:

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

แก้ไข: UTC ที่แท้จริงดีกว่า แต่เราต้องสอดคล้องกัน

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

แม้ว่าในความคิดที่สองจะไม่สำคัญตราบใดที่ทั้งสองวันอยู่ในเขตเวลาเดียวกัน


5
คุณอาจต้องการใช้ DateTime.UtcNow แทน DateTime.Now
Matt Dearing

2
เกี่ยวกับความคิดที่สองของคุณ: มันไม่สำคัญในระหว่างการเปลี่ยนเป็นหรือจากเวลาออมแสง (ฉันมักจะต้องคิดอย่างหนักที่จะจำสิ่งที่ :) ในระหว่างการเปลี่ยนแปลงชั่วโมง 2:00 ถึง 03:00 จะทำซ้ำสองครั้ง ซึ่งหมายความว่าในช่วง 1 ชั่วโมงวันที่ของจาวาสคริปต์จะดับลงหนึ่งชั่วโมง UTC ไม่มี DLS จึงไม่มีปัญหานั้น
Sebastiaan M

ฉันมีรหัสเดียวกันที่นี่ แต่ทำให้วันที่จาวาสคริปต์แตกต่างกัน 5:30 ในขณะที่วันที่ C # ทำงานได้ดี
Jenish Zinzuvadiya

45

JavaScript Date constructor ยอมรับจำนวนมิลลิวินาทีตั้งแต่ Unix epoch (1 มกราคม 1970 00:00:00 UTC) นี่คือวิธีการขยาย C # ที่แปลงวัตถุ. Net DateTime เป็นวันที่ 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);
   }
}

การใช้งาน JavaScript:

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

การใช้งาน C # วันที่ยาว = DateTimeJavaScript ToJavaScriptMilliseconds (DateTime); ตรวจสอบใน javascript (กด F12 ใน Google Chrome และไปที่คอนโซล) var date = วันที่ใหม่ (ยาว); console.log (date.toString ());
Gonen09

25

คุณสามารถลองสิ่งนี้ได้ในการดำเนินการของคุณ:

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

และสิ่งนี้ในความสำเร็จของ Ajax ของคุณ:

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

หรือสิ่งนี้ในมุมมองของคุณ: (Javascript บวก C #)

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

1
เข้าใจง่ายและรวดเร็ว
FindOutIslamNow

คำตอบที่ดีที่สุดสำหรับฉัน
Navid



4

ฉันรู้ว่ามันช้าไปหน่อย แต่นี่คือวิธีแก้ปัญหาที่ฉันต้องหามาเพื่อจัดการวันที่เมื่อคุณต้องการเป็นเขตเวลาที่เป็นอิสระ โดยพื้นฐานแล้วมันเกี่ยวข้องกับการแปลงทุกอย่างเป็น UTC

จาก Javascript ไปยังเซิร์ฟเวอร์ :

ส่งวันที่เป็นค่ายุคโดยลบเขตเวลาออก

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

จากนั้นเซิร์ฟเวอร์จะได้รับ 1420070400000 เป็นวันที่

ทางฝั่งเซิร์ฟเวอร์ให้แปลงค่ายุคนั้นเป็นอ็อบเจ็กต์วันที่และเวลา:

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

ณ จุดนี้วันที่เป็นเพียงวันที่ / เวลาที่ผู้ใช้ระบุตามที่ระบุไว้ เป็น UTC อย่างมีประสิทธิภาพ

ไปทางอื่น :

เมื่อเซิร์ฟเวอร์ดึงข้อมูลจากฐานข้อมูลซึ่งสันนิษฐานว่าเป็น UTC จะได้รับความแตกต่างเป็นยุค (ตรวจสอบให้แน่ใจว่าวัตถุวันที่ทั้งสองเป็นแบบโลคัลหรือ UTC):

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

หรือ

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

เมื่อ javascript ได้รับค่านี้ให้สร้างออบเจ็กต์วันที่ใหม่ อย่างไรก็ตามวัตถุวันที่นี้จะถือว่าเป็นเวลาท้องถิ่นดังนั้นคุณต้องชดเชยด้วยเขตเวลาปัจจุบัน:

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)

เท่าที่ฉันรู้สิ่งนี้ควรใช้กับเขตเวลาใดก็ได้ที่คุณต้องแสดงวันที่ที่ไม่ขึ้นกับเขตเวลา


3

วิธีนี้ใช้ได้ผลสำหรับฉัน:

   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 กับมีดโกน

----- มีดโกน / 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: สร้างรายการใน C # และกรอกข้อมูล
  • 2: สร้างอาร์เรย์ในจาวาสคริปต์
  • 3: ใช้มีดโกนเพื่อย้ำรายการ
  • 4: ใช้ @: เพื่อเปลี่ยนกลับเป็น js และ @ เพื่อเปลี่ยนเป็น C #
  • 5: -1 ในเดือนเพื่อแก้ไขตัวเลขเดือนใน js

โชคดี


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

ในการแปลงวันที่เป็นวันที่ JS (ตัวเลขทั้งหมด):

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

0

อีกคำตอบที่ล่าช้า แต่ขาดหายไปที่นี่ หากคุณต้องการจัดการกับการแปลงซีเรียลไลซ์/Date(1425408717000)/ในจาวาสคริปต์คุณสามารถโทร:

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

ที่มา: amirsahib


มันเป็นคำตอบ แต่ Yuck ฉันไม่แนะนำมัน แฮ็คสองอันไม่ถูกต้อง และการทำให้เป็นอนุกรมของ Microsoft เป็นการแฮ็กที่น่ารังเกียจ
Suncat2000

1
@ Suncat2000 แฮ็คนี้เป็นอย่างไร หากคุณใช้บริการเพื่อดึงค่าจากเซิร์ฟเวอร์ไปยังส่วนหน้าฉันไม่รู้ทางเลือกอื่นที่ดีกว่านี้ นี่เป็นวิธีแก้ปัญหาที่สะอาดที่สุดในหน้านี้ หากคุณรู้จักทางเลือกอื่นที่ดีกว่าโปรดแสดงตัวอย่างให้เราดู?
Kajbo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.