用DateTime和Timezone为每个用户设置相同值的计时器

本文关键字:设置 计时器 用户 DateTime Timezone | 更新日期: 2023-09-27 18:11:42

我有定时器。我有一个问题,我有几个时区的用户。一个人看到他还剩1小时另一个人看到他还剩6小时。我要确保他们都看了1次。我得到了这个测试代码,但是如果我在我的Windows上改变时间,我的计时器值就会改变。谢谢你的回答。

using System;
namespace timezone
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime endDate = DateTime.Parse("2015-09-10 22:20:41");
            TimeSpan difference = endDate - MoscowTime(DateTime.Now);
            Console.WriteLine(difference.Hours + ":" + difference.Minutes + ":" + difference.Seconds);
            Console.ReadLine();
        }
        public static DateTime MoscowTime(DateTime time)
        {
            TimeZone zone = TimeZone.CurrentTimeZone;
            DateTime universal = zone.ToUniversalTime(time);
            return universal.AddHours(3);
        }
    }
}

用DateTime和Timezone为每个用户设置相同值的计时器

保持您的DateTime对象在UTC:

var endDate = new DateTime(2015, 9, 10, 22, 20, 41, DateTimeKind.Utc);
var now = DateTime.UtcNow;
var difference = endDate - now;

如果你想把日期显示给用户,把它转换成当地时间,否则,保持在UTC。

如果您不想信任本地PC的内部时钟,您可以查询时间服务器以获得正确的时间:

如何使用c#查询NTP服务器?

这应该给你UTC的now值,你可以像往常一样继续-不依赖于本地PC上的时间。这显然需要PC在线。

如果endDate参数是用户设置的目标日期,并且使用用户的本地时区,则需要确保这两个日期位于同一时区。

一种方法是将endDate设置为与实际日期相同的时区:

class Program
{
    static void Main(string[] args)
    {
        DateTime endDate = MoscowTime(DateTime.Parse("2015-09-10 22:20:41"));
        TimeSpan difference = endDate - MoscowTime(DateTime.Now);
        Console.WriteLine(difference.Hours + ":" + difference.Minutes + ":" + difference.Seconds);
        Console.ReadLine();
    }
    public static DateTime MoscowTime(DateTime time)
    {
        TimeZone zone = TimeZone.CurrentTimeZone;
        DateTime universal = zone.ToUniversalTime(time);
        return universal.AddHours(3);
    }
}