在时区和日光之间转换

时间:2017-10-31 17:20:35

标签: c# datetime timezone timezone-offset

我发送日期和时间,用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);

但我还有一个小时的偏移,我需要有相同的日期和时间用户输入。

1 个答案:

答案 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)。