我有一个用于 DateTime 验证的自定义属性,它具有给定的 dateformat 以及 javascript 验证器,它们为我提供客户端和服务器端验证。但现在我应该更改我的日期时间验证,以便根据客户端本地日期时间格式执行它,我不知道如何。
我找不到任何对我有帮助的东西。
所以请告诉我如何至少实现客户端 DateTime 验证,或者如何通过 javascript 获取客户端的日期格式。
我有一个用于 DateTime 验证的自定义属性,它具有给定的 dateformat 以及 javascript 验证器,它们为我提供客户端和服务器端验证。但现在我应该更改我的日期时间验证,以便根据客户端本地日期时间格式执行它,我不知道如何。
我找不到任何对我有帮助的东西。
所以请告诉我如何至少实现客户端 DateTime 验证,或者如何通过 javascript 获取客户端的日期格式。
如果您可以确定用户的语言环境,则可以使用 .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();
获得完整浏览器支持并获得 ISO 日期而不转换为 UTC 的一种方法是使用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);