gpt4 book ai didi

javascript - c# 和 javascript 之间的夏令时问题

转载 作者:行者123 更新时间:2023-11-30 20:34:40 24 4
gpt4 key购买 nike

我有一个休息 api,它给我当前日期和当前日期的上个月,它有如下输出:

{
fromDate:2018-03-22T00:00:00+04:30
toDate:2018-04-22T00:00:00+04:30
}

如果我像下面这样在 JavaScript 中使用这两个日期,我会得到不同的结果:

new Date("2018-03-22T00:00:00+04:30")

console output: Wed Mar 21 2018 23:00:00 GMT+0330 (Iran Standard Time)

new Date("2018-04-22T00:00:00+04:30")

console output: Sun Apr 22 2018 00:00:00 GMT+0430 (Iran Daylight Time)

在 C# 方面,我使用这段代码从服务器获取日期:

 var toDate = DateTime.Now.Date;
DateTime fromDate = toDate.AddMonths(-1);

我怎样才能克服没有不同日期的问题?

最佳答案

由于 daylight saving time in Iran 的开始在 2018-03-22,随着时钟接近 00:00:00,它提前了一个小时到 01:00:00 .这段时间如果仔细观察时钟,就会发现它是这样前进的:

...
2018-03-21 23:59:58
2018-03-21 23:59:59
2018-03-22 01:00:00
2018-03-21 01:00:01
...

换句话说,当天 00:00:0000:59:59 的值在本地不存在时区。

由于您在 fromDate 中提供了这样一个不存在的值,并且您本地计算机的时区设置为伊朗,因此 JavaScript 会将其转换为有效时间点,如下所示:

2018-03-22T00:00:00+04:30   source input value
2018-03-21T19:30:00+00:00 converted to UTC
2018-03-21T23:00:00+03:30 converted to a valid local time

如果您希望获得当天的正确开始时间,您的 fromDate 必须是 2018-03-22T01:00:00+04:30.

要使用 C# 在服务器端正确计算,您需要使用 TimeZoneInfo API。考虑以下辅助方法:

static DateTimeOffset GetStartOfDay(DateTime dt, TimeZoneInfo tz)
{
// Work in the time zone provided
if (dt.Kind != DateTimeKind.Unspecified)
{
dt = TimeZoneInfo.ConvertTime(dt, tz);
}

// Start with assuming midnight
var d = dt.Date;

// Check for the time being invalid and handle if so
if (tz.IsInvalidTime(d))
{
// the gap is *usually* 1hr, but not always, so calculate it
var gap = tz.GetUtcOffset(dt.AddDays(1)) - tz.GetUtcOffset(dt.AddDays(-1));

// advance forward by the amount of the gap
d = d.Add(gap);
}

// Also check for the time being ambiguous, such as in a fall-back transition.
// We want the *first* occurrence, which will have a *larger* offset
var offset = tz.IsAmbiguousTime(d)
? tz.GetAmbiguousTimeOffsets(d).OrderByDescending(x => x).First()
: tz.GetUtcOffset(d);

// Now we know when the date starts precisely
return new DateTimeOffset(d, offset);
}

声明后,现在您可以轻松获得 API 的准确值:

var tz = TimeZoneInfo.FindSystemTimeZoneById("Iran Standard Time");
var date = new DateTime(2014, 3, 22); // or DateTime.UtcNow for the current date

DateTimeOffset fromDate = GetStartOfDay(date, tz);
DateTimeOffset toDate = GetStartOfDay(fromDate.AddDays(1).Date, tz);

当然,这假设伊朗是您希望从 API 发出的正确时区。如果您要为更广泛的受众提供服务,那么您可能需要相应地调整时区。

关于javascript - c# 和 javascript 之间的夏令时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49966543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com