发票中的暂存和生产发送日期时间之间的差异

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" 发生了两次。