不要依赖 JavaScript 的Date
构造函数来解析字符串。行为和支持的格式因浏览器和语言环境而异。 如果您直接使用该对象,这只是一些默认行为。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();
看 - 这很容易,而且您不需要对时区进行任何花哨的事情。