想要根据时区 ID Nodatime 显示日期和时间

本文关键字:显示 日期 时间 Nodatime ID 时区 | 更新日期: 2023-09-27 18:33:05

我听说如果我使用nodatime库,那么我可以根据时区ID获取日期和时间。首先,我更改了PC日期和时间。在我的电脑中设置为旧的日期和时间,然后运行以下让我失望的代码。

using NodaTime;
var zoneId = "Asia/Kolkata";
DateTimeZone _zone = DateTimeZoneProviders.Tzdb[zoneId];
ZonedDateTime _now = SystemClock.Instance.Now.InZone(_zone);
var xx = _now.LocalDateTime;

下面的代码显示错误的日期和时间,因为我将我的电脑日期和时间设置为几天前。

有什么办法,如果日期和时间是错误的,但代码仍然显示正确的日期和时间,而不依赖于使用Noda时间库的用户PC日期和时间设置。寻找建议。

更新

遵循这种方式,但不确定我是否在正确的道路上实现我的目标。

public static DateTime GetFastestNISTDate()
{
        var result = DateTime.MinValue;
    DateTime utcDateTime= DateTime.MinValue;
    // Initialize the list of NIST time servers
    // http://tf.nist.gov/tf-cgi/servers.cgi
    string[] servers = new string[] {
        "nist1-ny.ustiming.org",
        "nist1-nj.ustiming.org",
        "nist1-pa.ustiming.org",
        "time-a.nist.gov",
        "time-b.nist.gov",
        "nist1.aol-va.symmetricom.com",
        "nist1.columbiacountyga.gov",
        "nist1-chi.ustiming.org",
        "nist.expertsmi.com",
        "nist.netservicesgroup.com"
};
        // Try 5 servers in random order to spread the load
        Random rnd = new Random();
        foreach (string server in servers.OrderBy(s => rnd.NextDouble()).Take(5))
        {
            try
            {
                // Connect to the server (at port 13) and get the response
                string serverResponse = string.Empty;
                using (var reader = new StreamReader(new System.Net.Sockets.TcpClient(server, 13).GetStream()))
                {
                    serverResponse = reader.ReadToEnd();
                }
                // If a response was received
                if (!string.IsNullOrEmpty(serverResponse))
                {
                    // Split the response string ("55596 11-02-14 13:54:11 00 0 0 478.1 UTC(NIST) *")
                    string[] tokens = serverResponse.Split(' ');
                    // Check the number of tokens
                    if (tokens.Length >= 6)
                    {
                        // Check the health status
                        string health = tokens[5];
                        if (health == "0")
                        {
                            // Get date and time parts from the server response
                            string[] dateParts = tokens[1].Split('-');
                            string[] timeParts = tokens[2].Split(':');
                            // Create a DateTime instance
                            DateTime utcDateTime = new DateTime(
                                Convert.ToInt32(dateParts[0]) + 2000,
                                Convert.ToInt32(dateParts[1]), Convert.ToInt32(dateParts[2]),
                                Convert.ToInt32(timeParts[0]), Convert.ToInt32(timeParts[1]),
                                Convert.ToInt32(timeParts[2]));
                            // Convert received (UTC) DateTime value to the local timezone
                            //result = utcDateTime.ToLocalTime();
                            return utcDateTime;
                            // Response successfully received; exit the loop
                        }
                    }
                }
            }
            catch
            {
                // Ignore exception and try the next server
            }
        }
        return result;
    }

    var wc = GetFastestNISTDate();
    var pattern = InstantPattern.CreateWithInvariantCulture("dd/MM/yyyy HH:mm:ss");
    var parseResult = pattern.Parse(wc.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture));
    if (!parseResult.Success)
        throw new InvalidDataException("...whatever...");
    var instant = parseResult.Value;
    var timeZone = DateTimeZoneProviders.Tzdb["Europe/London"];
    var zonedDateTime = instant.InZone(timeZone);
var bclDateTime = zonedDateTime.ToDateTimeUnspecified();

想要根据时区 ID Nodatime 显示日期和时间

如果您不能信任计算机的时钟,则必须从其他来源获取时间,例如通过 NTP 连接从网络服务器获取时间。 野田时间没有此功能。

您可能对此答案感兴趣,它描述了如何在 C# 中查询 NTP 服务器。 请注意,在该答案的代码末尾,它调用ToLocalTime 。 相反,您将使用Noda Time的Instant.FromDateTimeUtc方法。