在时区和夏令时之间转换
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).
我正在将日期和时间与 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).