如果您可以确定用户的语言环境,则可以使用 .Net 全球化类来协助服务器端解析日期时间字符串。例如:
// Parsed as January 4th
var dt1 = DateTime.Parse("1/4/2013", new CultureInfo("en-US"));
// Parsed as April 1st
var dt2 = DateTime.Parse("1/4/2013", new CultureInfo("en-GB"));
但最好的办法是完全避免这种情况。在您的 JavaScript 代码中,将值作为 ISO8601 字符串返回 - 这是文化不变的。本机浏览器对此的支持各不相同。内置函数可在 IE9+ 中运行。
// This returns an ISO formatted date, in UTC.
var s = yourDate.ToISOString();
获得完整浏览器支持并在不转换为 UTC 的情况下获得 ISO 日期的一种方法是使用 moment.js 库,其中 ISO8601 是默认格式:
// This returns an ISO formatted date, with the user's local offset.
var s = moment(yourDate).format();
// This returns an ISO formatted date, in UTC.
var s = moment(yourDate).utc().format();
当您将这些值发送到服务器时,您可以在您的 .Net 代码中解析它们而无需考虑文化。格式已经是文化不变的。为了防止服务器的时区受到干扰,您应该将它们解析为DateTimeOffset:
// assuming this is an ISO value you got from the client:
var s = "2013-04-20T09:00:00-07:00";
// simply parse it
var dto = DateTimeOffset.Parse(s);
// if you don't care about the offset at this point:
var dt = dto.DateTime;
当然,如果你想优雅地失败,你可以这样做:
DateTimeOffset dto;
var isValid = DateTimeOffset.TryParse(s, out dto);