DateTime đến ngày javascript


98

Từ một câu trả lời khác trên Stackoverflow là chuyển đổi từ ngày Javascript thành .net DateTime:

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

Nhưng làm thế nào để làm điều ngược lại? DateTime đến Javascript Ngày?


Trong những câu hỏi như thế này rõ ràng là liên quan đến ajax, bạn nên chỉ định nơi bạn đang thực hiện chuyển đổi và xem xét rằng không có tiêu chuẩn cho tuần tự hóa ngày tháng trong JSON và có thể bạn đang xử lý munging MS Date, ví dụ / Date (02020202 ) / hãy chắc chắn để làm cho điều đó rõ ràng. chúc may mắn
Sky Sanders

2
Bạn nên liên kết câu trả lời mà bạn đang đề cập đến
cdmckay

Câu trả lời:


116

Thử:

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

Chỉnh sửa: UTC đúng thì tốt hơn, nhưng sau đó chúng ta cần nhất quán

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

Mặc dù, suy nghĩ lại thì điều đó không quan trọng, miễn là cả hai ngày ở cùng múi giờ.


5
Bạn có thể muốn sử dụng DateTime.UtcNow thay vì DateTime.Now
Matt Dashing

2
Về suy nghĩ thứ hai của bạn: nó thực sự quan trọng trong quá trình chuyển đổi sang hoặc từ thời gian tiết kiệm ánh sáng ban ngày (tôi luôn phải suy nghĩ rất nhiều để nhớ cái nào :). Trong quá trình chuyển đổi, giờ từ 2 giờ đến 3 giờ được lặp lại hai lần. Điều này có nghĩa là trong một giờ, ngày javascript sẽ tắt một giờ. UTC không có DLS nên nó không có vấn đề đó.
Sebastiaan M

Tôi có cùng một mã ở đây nhưng nó tạo ra sự khác biệt 5:30 trong ngày javascript trong khi ngày C # hoạt động tốt.
Jenish Zinzuvadiya

44

JavaScript Date constructor chấp nhận số mili giây kể từ kỷ nguyên Unix (ngày 1 tháng 1 năm 1970 00:00:00 UTC). Đây là phương thức mở rộng C # chuyển đổi đối tượng .Net DateTime thành ngày 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);
   }
}

Sử dụng JavaScript:

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

Ngày dài sử dụng C # = DateTimeJavaScript.ToJavaScriptMilliseconds (DateTime); kiểm tra trong javascript (Nhấn F12 trong Google Chrome và truy cập bảng điều khiển) var date = new Date (long); console.log (date.toString ());
Gonen09

24

Bạn có thể thử điều này trong Hành động của mình:

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

Và điều này tạo nên thành công cho Ajax của bạn:

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

Hoặc điều này trong Chế độ xem của bạn: (Javascript cộng với C #)

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

1
Dễ dàng và nhanh chóng để có được hiểu
FindOutIslamNow

câu trả lời tốt nhất cho tôi
Navid

23

Với Moment.js chỉ cần sử dụng:

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

Trong trường hợp netDateTimecó thể thay đổi DateTime bạn đăng, một cái gì đó giống như "/Date(1456956000000+0200)/".


11

Cái này cần phải dùng mẹo:

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

4

Tôi biết điều này là hơi muộn, nhưng đây là giải pháp tôi đã nghĩ ra để xử lý ngày tháng khi bạn muốn độc lập về múi giờ. Về cơ bản, nó liên quan đến việc chuyển đổi mọi thứ sang UTC.

Từ Javascript đến Máy chủ :

Gửi các ngày dưới dạng giá trị kỷ nguyên với độ lệch múi giờ bị xóa.

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

Sau đó, máy chủ nhận 1420070400000 là kỷ nguyên ngày.

Ở phía Máy chủ, chuyển đổi giá trị kỷ nguyên đó thành một đối tượng datetime:

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

Tại thời điểm này, ngày chỉ là ngày / giờ do người dùng cung cấp khi họ cung cấp. Thực tế nó là UTC.

Đi theo hướng khác :

Khi máy chủ lấy dữ liệu từ cơ sở dữ liệu, có lẽ là ở UTC, hãy nhận sự khác biệt dưới dạng kỷ nguyên (đảm bảo rằng cả hai đối tượng ngày đều là cục bộ hoặc UTC):

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

hoặc là

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

Khi javascript nhận được giá trị này, hãy tạo một đối tượng ngày tháng mới. Tuy nhiên, đối tượng ngày này sẽ được giả định là giờ địa phương, vì vậy bạn cần bù đắp nó bằng múi giờ hiện tại:

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)

Theo như tôi biết, điều này sẽ hoạt động cho bất kỳ múi giờ nào mà bạn cần hiển thị ngày tháng độc lập với múi giờ.


3

Phương pháp này đang làm việc cho tôi:

   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

Nếu bạn sử dụng MVC với dao cạo

----- Dao cạo / 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: Tạo danh sách bằng C # và điền vào
  • 2: Tạo một mảng trong javascript
  • 3: Sử dụng dao cạo để lặp lại danh sách
  • 4: Sử dụng @: để chuyển về js và @ để chuyển sang C #
  • 5: Số -1 trong tháng để sửa số tháng tính bằng js.

Chúc may mắn


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

Để chuyển đổi ngày thành ngày JS (tất cả các số):

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

0

Một câu trả lời muộn, nhưng điều này bị thiếu ở đây. Nếu bạn muốn xử lý chuyển đổi tuần tự hóa /Date(1425408717000)/trong javascript, bạn có thể chỉ cần gọi:

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

Nguồn: amirsahib


Đó là một câu trả lời nhưng, Yuck. Tôi không khuyến khích nó. Hai lần hack không thành công. Và việc đăng nhiều kỳ của Microsoft là một vụ hack đáng sợ.
Suncat2000

@ Suncat2000 hack này như thế nào? Nếu bạn đang sử dụng một dịch vụ để truy xuất giá trị từ máy chủ đến giao diện người dùng, tôi không biết bất kỳ sự thay thế nào tốt hơn. Đây là giải pháp rõ ràng nhất của vấn đề trên trang này. Nếu bạn biết cách thay thế tốt hơn, hãy quan tâm để cho chúng tôi xem ví dụ?
Kajbo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.