发票中的暂存和生产发送日期时间之间的差异
Difference between Staging and production sent datetime in invoice
我们使用 GMT 时区进行筹备和制作。但是当代码执行时,它在暂存中显示正确的结果而在生产中显示错误。
bool checkTimeBSTorGMT = TimeZoneInfo.Local.IsDaylightSavingTime(records.GetDateTimeOrEmpty("notification_date"));
if (checkTimeBSTorGMT == true)
{
DateTime dt = new DateTime();
dt = records.GetDateTimeOrEmpty("notification_date");
dt = dt.AddHours(1);
instance.SentDateTime = dt;
}
else
{
instance.SentDateTime = records.GetDateTimeOrEmpty("notification_date");
}
我的代码如上。我希望它应该根据世界各地的用户本地机器获取正确的日期。
我不会尝试推出自己的时间和时区代码。它将以泪水结束。 (夏令时偏差总是 60 分钟吗?您的代码假定如此)
这是在两个时区之间进行转换的更好方法。我在其中包含了一些更不寻常的时区。
using System;
public class Program
{
private static void DisplayTimeInTimeZone(DateTime timeOfInterestUTC, string timezoneId)
{
Console.WriteLine($"UTC Time {timeOfInterestUTC} in {timezoneId} is {TimeZoneInfo.ConvertTime(timeOfInterestUTC, TimeZoneInfo.FindSystemTimeZoneById(timezoneId))}");
}
public static void Main()
{
/*
// In case you were wondering what Timezones are available
foreach (var tz in TimeZoneInfo.GetSystemTimeZones())
{
Console.WriteLine(tz.Id);
}
*/
DateTime someArbitraryLocalTime = new DateTime(2018, 2, 15, 9, 30, 0);
DateTime someArbitraryTimeAsUTC = TimeZoneInfo.ConvertTimeToUtc(someArbitraryLocalTime, TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time"));
Console.WriteLine($"US Eastern Standard Time {someArbitraryLocalTime} in UTC is {someArbitraryTimeAsUTC}");
DisplayTimeInTimeZone(someArbitraryTimeAsUTC, "GMT Standard Time");
DisplayTimeInTimeZone(someArbitraryTimeAsUTC, "Cen. Australia Standard Time");
DisplayTimeInTimeZone(someArbitraryTimeAsUTC, "Chatham Islands Standard Time");
DisplayTimeInTimeZone(someArbitraryTimeAsUTC, TimeZoneInfo.Local.Id);
}
}
我不清楚 notification_date 和 SentDateTime 与时区有关。如果它们已经是 UTC,那么它只是您需要转换它的 ConvertTime 方法。
如果它是参考时区的本地时间,您需要先使用 ConvertTimeToUtc。如果它来自用户输入,请注意有些时间对于有夏令时的时区不存在(当 DST 开始时,我们将时钟向前设置一个小时,因此 "hour" 中的任何时间都是未定义的)。相反,转换在 DST 结束时是不明确的,因为 "hour" 发生了两次。
我们使用 GMT 时区进行筹备和制作。但是当代码执行时,它在暂存中显示正确的结果而在生产中显示错误。
bool checkTimeBSTorGMT = TimeZoneInfo.Local.IsDaylightSavingTime(records.GetDateTimeOrEmpty("notification_date"));
if (checkTimeBSTorGMT == true)
{
DateTime dt = new DateTime();
dt = records.GetDateTimeOrEmpty("notification_date");
dt = dt.AddHours(1);
instance.SentDateTime = dt;
}
else
{
instance.SentDateTime = records.GetDateTimeOrEmpty("notification_date");
}
我的代码如上。我希望它应该根据世界各地的用户本地机器获取正确的日期。
我不会尝试推出自己的时间和时区代码。它将以泪水结束。 (夏令时偏差总是 60 分钟吗?您的代码假定如此)
这是在两个时区之间进行转换的更好方法。我在其中包含了一些更不寻常的时区。
using System;
public class Program
{
private static void DisplayTimeInTimeZone(DateTime timeOfInterestUTC, string timezoneId)
{
Console.WriteLine($"UTC Time {timeOfInterestUTC} in {timezoneId} is {TimeZoneInfo.ConvertTime(timeOfInterestUTC, TimeZoneInfo.FindSystemTimeZoneById(timezoneId))}");
}
public static void Main()
{
/*
// In case you were wondering what Timezones are available
foreach (var tz in TimeZoneInfo.GetSystemTimeZones())
{
Console.WriteLine(tz.Id);
}
*/
DateTime someArbitraryLocalTime = new DateTime(2018, 2, 15, 9, 30, 0);
DateTime someArbitraryTimeAsUTC = TimeZoneInfo.ConvertTimeToUtc(someArbitraryLocalTime, TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time"));
Console.WriteLine($"US Eastern Standard Time {someArbitraryLocalTime} in UTC is {someArbitraryTimeAsUTC}");
DisplayTimeInTimeZone(someArbitraryTimeAsUTC, "GMT Standard Time");
DisplayTimeInTimeZone(someArbitraryTimeAsUTC, "Cen. Australia Standard Time");
DisplayTimeInTimeZone(someArbitraryTimeAsUTC, "Chatham Islands Standard Time");
DisplayTimeInTimeZone(someArbitraryTimeAsUTC, TimeZoneInfo.Local.Id);
}
}
我不清楚 notification_date 和 SentDateTime 与时区有关。如果它们已经是 UTC,那么它只是您需要转换它的 ConvertTime 方法。
如果它是参考时区的本地时间,您需要先使用 ConvertTimeToUtc。如果它来自用户输入,请注意有些时间对于有夏令时的时区不存在(当 DST 开始时,我们将时钟向前设置一个小时,因此 "hour" 中的任何时间都是未定义的)。相反,转换在 DST 结束时是不明确的,因为 "hour" 发生了两次。