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

Posted

技术标签:

【中文标题】发票中暂存和生产发送日期时间之间的差异【英文标题】:Difference between Staging and production sent datetime in invoice 【发布时间】:2018-09-28 12:18:29 【问题描述】:

我们有 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");

我的代码如上。我希望它应该根据世界各地的用户本地机器获取正确的日期。

【问题讨论】:

这是什么应用程序?当您说“生产”时,您是指某处的某个服务器(例如 Web 服务器)还是用户自己的计算机(例如带有桌面应用程序)?这一切都不同,因为TimeZoneInfo.Local 反映了执行代码的计算机的时区设置 申请是针对英国国家的,服务器是在那里设置的。 【参考方案1】:

我不会尝试滚动自己的时间和时区代码。会以泪水收场。 (夏令时偏差总是 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 开始时,我们将时钟向前设置一个小时,因此该“小时”中的任何时间都是未定义的)。相反,在 DST 结束时转换是不明确的,因为那个“小时”发生了两次。

【讨论】:

以上是关于发票中暂存和生产发送日期时间之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

当我在 Windows Azure 上交换暂存和生产部署时出现“错误:19 - 物理连接不可用”

如何为测试、暂存和生产配置 Google Cloud Pub/Sub?

在 git 中暂存文件?

git常用操作合集

仅在 git 中暂存分阶段的更改 - 有可能吗?

是否可以在 Dataflow 中暂存模型文件?