在 Javascript 中设置默认 DateTimeOffset
Setting default DateTimeOffset in Javascript
假设我有一个名为 'Order' 的实体,有一个名为 'OrderDate' 的 属性。在服务器上的保存管道中,我有这样的验证逻辑:
partial void Orders_Validate(Order entity, EntitySetValidationResultsBuilder results) {
if(entity.OrderDate > DateTime.Today)
results.AddPropertyError(
"Please specify a date that is not in the future",
entity.Details.Properties.OrderDate);
}
为了简化 HTML 客户端中的数据输入,当用户创建一个新订单时,我想在实体的 'created' 事件中默认将 OrderDate 设置为今天,像这样:
myapp.Order.created = function (entity) {
entity.OrderDate = new Date();
entity.OrderDate.setHours(0, 0, 0, 0);
};
只要服务器和客户端处于同一时区,就可以正常工作。
这是我的三个问题:
- 如果客户在东亚的某个地方,例如凌晨,这是否也有效?星期一但服务器在美国,那里还是星期天?
- 属性 'OrderDate' 的正确数据类型是什么?它应该是 DateTimeOffset 还是仅适用于 Date?
- 如果类型是 DateTimeOffset,在 javascript
中设置 'OrderDate' 属性 的正确方法是什么
感谢帮助,
祝福
来自 LightSwitch 团队的以下博客 post 提供了一些关于处理不同时区的最佳实践的有用背景:
What Time Is It? Global Time (Steve Lasker)
基于此,您可以将 OrderDate 字段定义为 DateTimeOffset,并按照建议将其默认设置在 JavaScript 客户端上,例如:
myapp.Order.created = function (entity) {
entity.OrderDate = new Date();
entity.OrderDate.setHours(0, 0, 0, 0);
};
然后,当您使用 DateTimeOffset 时,它应该使用适当的时区偏移存储客户端值,从而允许您在验证中实施以下类型的方法:
partial void Orders_Validate(Order entity, EntitySetValidationResultsBuilder results) {
if (entity.OrderDate.Date > DateTimeOffset.Now.Date) {
var languages = HttpContext.Current.Request.UserLanguages;
// As the browser's language may not be set,
// the following falls back to the server's current culture info
var ci = languages != null && languages.Length > 0 ?
new System.Globalization.CultureInfo(languages[0]) :
System.Globalization.CultureInfo.CurrentCulture;
results.AddPropertyError(
String.Format(
"The date {0} is invalid, please specify a date that is not in the future",
entity.OrderDate.ToLocalTime().Date.ToString("d", ci)),
entity.Details.Properties.OrderDate);
}
}
为了以防万一,上面的示例通过使用 ToLocalTime 并通过用户当前的 HTTP 请求检索用户的浏览器语言,以本地时区和文化特定的短格式显示验证消息的日期。
假设我有一个名为 'Order' 的实体,有一个名为 'OrderDate' 的 属性。在服务器上的保存管道中,我有这样的验证逻辑:
partial void Orders_Validate(Order entity, EntitySetValidationResultsBuilder results) {
if(entity.OrderDate > DateTime.Today)
results.AddPropertyError(
"Please specify a date that is not in the future",
entity.Details.Properties.OrderDate);
}
为了简化 HTML 客户端中的数据输入,当用户创建一个新订单时,我想在实体的 'created' 事件中默认将 OrderDate 设置为今天,像这样:
myapp.Order.created = function (entity) {
entity.OrderDate = new Date();
entity.OrderDate.setHours(0, 0, 0, 0);
};
只要服务器和客户端处于同一时区,就可以正常工作。
这是我的三个问题:
- 如果客户在东亚的某个地方,例如凌晨,这是否也有效?星期一但服务器在美国,那里还是星期天?
- 属性 'OrderDate' 的正确数据类型是什么?它应该是 DateTimeOffset 还是仅适用于 Date?
- 如果类型是 DateTimeOffset,在 javascript 中设置 'OrderDate' 属性 的正确方法是什么
感谢帮助,
祝福
来自 LightSwitch 团队的以下博客 post 提供了一些关于处理不同时区的最佳实践的有用背景:
What Time Is It? Global Time (Steve Lasker)
基于此,您可以将 OrderDate 字段定义为 DateTimeOffset,并按照建议将其默认设置在 JavaScript 客户端上,例如:
myapp.Order.created = function (entity) {
entity.OrderDate = new Date();
entity.OrderDate.setHours(0, 0, 0, 0);
};
然后,当您使用 DateTimeOffset 时,它应该使用适当的时区偏移存储客户端值,从而允许您在验证中实施以下类型的方法:
partial void Orders_Validate(Order entity, EntitySetValidationResultsBuilder results) {
if (entity.OrderDate.Date > DateTimeOffset.Now.Date) {
var languages = HttpContext.Current.Request.UserLanguages;
// As the browser's language may not be set,
// the following falls back to the server's current culture info
var ci = languages != null && languages.Length > 0 ?
new System.Globalization.CultureInfo(languages[0]) :
System.Globalization.CultureInfo.CurrentCulture;
results.AddPropertyError(
String.Format(
"The date {0} is invalid, please specify a date that is not in the future",
entity.OrderDate.ToLocalTime().Date.ToString("d", ci)),
entity.Details.Properties.OrderDate);
}
}
为了以防万一,上面的示例通过使用 ToLocalTime 并通过用户当前的 HTTP 请求检索用户的浏览器语言,以本地时区和文化特定的短格式显示验证消息的日期。