Đừng dựa vào JavaScript của Date
hàm tạo để phân tích chuỗi. Hành vi và định dạng được hỗ trợ thay đổi một cách dữ dội trên mỗi trình duyệt và ngôn ngữ. Here chỉ là một số hành vi mặc định nếu bạn sử dụng đối tượng Date
trực tiếp.
Nếu bạn phải đến từ một chuỗi, hãy thử sử dụng định dạng được chuẩn hóa như ISO8601. Ngày bạn đưa vào định dạng đó sẽ là "2012-06-25T12:00:00"
. Cách dễ nhất để làm việc với những thứ này trong JavaScript là với moment.js.
Ngoài ra, hãy cẩn thận về những gì bạn thực sự có ý nghĩa đại diện. Ngay bây giờ, bạn đang chuyển ngày/giờ địa phương, lưu địa phương/ngày/giờ và trả về ngày/giờ địa phương. Trên đường đi, ý tưởng về những gì "địa phương" có thể thay đổi.
Trong nhiều trường hợp, ngày/giờ được thiết kế để đại diện cho một thời điểm chính xác chính xác. Để thực hiện công việc đó, bạn cần phải chuyển đổi từ giờ địa phương được nhập thành UTC trên máy khách. Gửi UTC đến máy chủ của bạn và lưu trữ nó. Sau đó, truy xuất UTC và gửi lại cho khách hàng của bạn, xử lý nó dưới dạng UTC và chuyển đổi về giờ địa phương. Bạn có thể làm tất cả điều này một cách dễ dàng với moment.js:
// I'll assume these are the inputs you have. Adjust accordingly.
var dateString = "6-25-2012";
var timeString = "12:00:00 PM";
// Construct a moment in the default local time zone, using a specific format.
var m = moment(dateString + " " + timeString, "M-D-YYYY h:mm:ss A");
// Get the value in UTC as an ISO8601 formatted string
var utc = m.toISOString(); // output: "2012-06-25T19:00:00.000Z"
Trên máy chủ trong Net:
var dt = DateTime.Parse("2012-06-25T19:00:00.000Z", // from the input variable
CultureInfo.InvariantCulture, // recommended for ISO
DateTimeStyles.RoundtripKind) // honor the Z for UTC kind
cửa hàng đó trong cơ sở dữ liệu. Sau đó lấy nó và gửi nó trở lại:
// when you pull it from your database, set it to UTC kind
var dt = DateTime.SpecifyKind((DateTime)reader["yourfield"], DateTimeKind.Utc);
// send it back in ISO format:
var s = dt.ToString("o"); // "o" is the ISO8601 "round-trip" pattern.
đèo nó trở lại javascript trong moment.js:
// construct a moment:
var m = moment("2012-06-25T19:00:00.000Z"); // use the value from the server
// display it in this user's local time zone, in whatever format you want
var s = m.format("LLL"); // "June 25 2012 12:00 PM"
// or if you need a Date object
var dt = m.toDate();
Xem - đó là dễ dàng, và bạn không cần phải nhận được vào bất cứ điều gì ưa thích với múi giờ.
Bạn có thể muốn xử lý ngày của mình dưới dạng số giây d.getTime()/1000 có thể dễ dàng được chuyển đổi về ngày bằng hầu hết các ngôn ngữ. – Serge
Ok, nhưng nếu ngày ban đầu được xây dựng từ các phần chuỗi (hai điều khiển khác nhau, một từ bộ chọn ngày, bảng điều khiển còn lại tại công cụ chọn thời gian), sau đó một lần nữa làm cách nào để nói ngày JavaScript mà tôi xây dựng múi giờ của nó, nếu không thì d.getTime()/1000 sẽ được thực hiện dựa vào thời gian tôi cho nó, trừ đi 4 giờ. – brushleaf
Bạn có chạy thử nghiệm với múi giờ khác nhau để đảm bảo vấn đề đến từ đó chứ không phải từ chuyển đổi không? – Serge