我需要制造在用户选择的时区工作的错觉。服务器和客户端代码坚持使用javascript日期的问题。因此,为了达到要求,我已经从 utc 手动映射到客户端的日期:
dateToServer(date) {
const momentDate = moment(date);
let serverDate = null;
if (momentDate.isValid() && date) {
const browserUtcOffset = momentDate.utcOffset();
serverDate = momentDate
.utc()
.subtract(this.clientTimeZoneOffset, 'minutes')
.add(browserUtcOffset, 'minutes')
.toDate();
}
return serverDate;
}
dateToClient(date) {
const momentDate = moment(date);
let uiDate = null;
if (momentDate.isValid() && date) {
const browserUtcOffset = momentDate.utcOffset();
uiDate = momentDate
.utc()
.subtract(browserUtcOffset, 'minutes')
.add(this.clientTimeZoneOffset, 'minutes')
.toDate();
}
return uiDate;
}
我正在添加/减去 browserUtcOffset,因为当日期在服务器和客户端之间移动时,它会由浏览器自动添加/减去。
它运行良好,但此解决方案缺少对 DST 的处理。我想检查该日期的 DST 是否有效,然后在需要时添加 DST 偏移量。
这里的 C# 代码,可以做到这一点:
string timeZone = "Central Standard Time";
TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
DateTime date = new DateTime(2011, 3, 14);
Console.WriteLine(timeZoneInfo.BaseUtcOffset.TotalMinutes); // -360
Console.WriteLine(timeZoneInfo.GetUtcOffset(date).TotalMinutes); // -300
Console.WriteLine(timeZoneInfo.IsDaylightSavingTime(date)); // true
Console.WriteLine(timeZoneInfo.DaylightName);
Console.WriteLine(timeZoneInfo.SupportsDaylightSavingTime);
我isDST
在 momentjs 中找到了,当我将 Windows 本地时区设置为 CST 并检查moment([2011, 2, 14]).isDST();
浏览器控制台时,我看到了真实情况。如何查看isDST
取决于浏览器本地时间。
下一步尝试像我在 C# 中所做的那样使用 moment-timezone 来做某事。不幸的是,我不明白如何实现这一点。作为起点,我遇到的第一个问题是:UTC time
, Base offset(-360 in C# sample)
, timezone name: Central Standard Time
,但是时刻时区中的时区是不同的。
moment.tz.names().map(name => moment.tz.zone(name)).filter(zone => zone.abbrs.find(abbr => abbr === 'CST') != null)
此代码返回 68 个时区。
为什么他们每个人都有很多缩写?直到是什么意思?我只想检查所选时区的UTC时间,即“中央标准时间”,夏令时是否有效。再看一次 C# 示例 :)
string timeZone = "Central Standard Time";
TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
DateTime date = new DateTime(2011, 3, 14);
Console.WriteLine(timeZoneInfo.BaseUtcOffset.TotalMinutes); //-360
Console.WriteLine(timeZoneInfo.GetUtcOffset(date).TotalMinutes); //-300
Console.WriteLine(timeZoneInfo.IsDaylightSavingTime(date)); //true, I have checked is daylightsavingtime for the date
Console.WriteLine(timeZoneInfo.DaylightName);
Console.WriteLine(timeZoneInfo.SupportsDaylightSavingTime);
该应用程序已在 angularjs 1.6.3 上编写。