我发送日期和时间,用javascript分隔给服务器:
var date = $("#txtDate").toISOString();
var time = $("#txtTime").toISOString();
我在服务器端获得了两个对象,但我的服务器时区与我的不同,并且偏移了一个小时。因此决定转换时区:
var timeToSave = date.AddHours(time.Hours).addMinutes(time.Minutes);
var timeZone = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
var newDateTime = TimeZoneinfo.ConvertTimeFromUtc(timeToSave, timeZone);
直到最后一个星期天夏令时在我的时区结束时,这种情况一直很顺利,我再次获得了一小时的抵消。
我意识到"时区" class有一种方法可以知道" datetime"是夏令时(IsDaylightSavingtime),但无论我作为参数发送的日期时间,此方法始终返回true。
if (timeZone.IsDaylightSavingTime(newDateTime))
{
timeToSave = timeToSave.AddHours(-1);
}
我该如何解决?
感谢。
更新
根据Matt Johnson的回答,我能够使用momentjs库添加时间并将其发送到服务器端。这就是新代码的样子:
//javascript
//this return a moment object
var dateMoment = row.find(".txtDate").data('DateTimePicker').getDate();
//this return a moment object too
var timeMoment = row.find(".txtTime").data('DateTimePicker').getDate();
//This object I send to server side
var dateToSend = dateMoment.add(timeMoment.format('HH'), 'hours').add(timeMoment.format('mm'), 'minutes');
然后在服务器端,我在时区之间进行转换
var timeZone = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
var dateTimeToSave = TimeZoneInfo.ConvertTimeFromUtc(datetimeFromJS.ToUniversalTime(), timeZone);
但我还有一个小时的偏移,我需要有相同的日期和时间用户输入。
答案 0 :(得分:3)
请勿使用IsDaylightSavingTime
来决定是自行添加还是减去一小时。这项工作已经由ConvertTimeFromUtc
方法完成。
尽管有名称,"Mountain Standard Time"
此处确实已经考虑了夏令时。它包括MST和MDT,以及北美转型(如丹佛)。
可能的问题来源是:
// client-side JS
var date = $("#txtDate").toISOString();
var time = $("#txtTime").toISOString();
// server-side C#
var timeToSave = date.AddHours(time.Hours).addMinutes(time.Minutes);
不是单独向服务器发送日期和时间,而是在转换为UTC之前将它们组合在客户端上。然后,您不需要在服务器端将它们一起添加。
换句话说,您无法使用仅限日期或仅限时间的数据从本地转换为UTC。
根据您的修改,(我相信日期选择器上的功能为date()
而不是getDate()
),您应该将客户端代码更改为:
var dateToSend = moment(dateMoment).hour(timeMoment.hour()).minute(timeMoment.minute());
var utcString = dateToSend.toISOString();
不要在服务器端代码上调用.ToUniversalTime()
。您收到的值是已经的通用时间(as converted by the toISOString()
function)。