例如,使用日期和时间控件,用户选择一个日期和时间,这样的字符串表示如下:
"6-25-2012 12:00:00 PM"
正好这个用户在EST时区。该字符串被传递到服务器,服务器将其转换为 .NET DateTime 对象,然后将其存储在 SQL Server 中的日期时间列中。
当日期稍后返回到浏览器时,需要将其转换回日期,但是当将上述字符串输入日期时,它会损失 4 小时的时间。我相信这是因为在创建 JavaScript 日期时未指定时区时,它默认为本地时间,并且由于 EST 是格林威治标准时间的 -400,它从中午 12 点减去 4 小时,即使中午 12 点本应指定为 EST用户在 EST 时区的机器上选择了它。
很明显,在将原始日期时间字符串传递给服务器进行持久化之前,需要将其添加到原始日期时间字符串中。推荐的做法是什么?
最佳答案
不要依赖 JavaScript 的 Date
构造函数来解析字符串。行为和支持的格式因浏览器和语言环境而异。 Here如果您直接使用 Date
对象,这只是一些默认行为。
如果您必须来自字符串,请尝试使用标准化格式,例如 ISO8601。您以该格式提供的日期将是 "2012-06-25T12:00:00"
。在 JavaScript 中使用它们的最简单方法是使用 moment.js .
此外,请注意您实际要表达的意思。现在,您正在传递本地日期/时间、保存本地/日期/时间并返回本地日期/时间。在此过程中,“本地”的概念可能会发生变化。
在许多情况下,日期/时间旨在表示准确 的时间。要使其工作,您需要将输入的本地时间转换为客户端上的 UTC。将 UTC 发送到您的服务器,并存储它。稍后,检索 UTC 并将其发送回您的客户端,将其作为 UTC 处理并转换回本地时间。您可以使用 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"
在 .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
将其存储在数据库中。稍后取回并发回:
// 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.
将其传回 moment.js 中的 javascript:
// 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();
看 - 这很简单,您不需要对时区感兴趣。
关于javascript - 如何在浏览器和服务器之间来回保存 JavaScript 日期的时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18181524/