在时区和夏令时之间转换

Convert between timezones and daylightsavings

我正在将日期和时间与 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);

直到上周日夏令时在我的时区结束时,它一直运行良好,我又得到了一个小时的偏移量。

我意识到 "timezone" class 有一种方法可以知道 "datetime" 是否使用夏令时 (IsDaylightSavingtime),但无论什么日期时间,此方法总是 return 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);

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

不要用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()。您收到的值 already 在世界标准时间 (as converted by the toISOString() function).