【问题标题】:Set timer for same value for every user with DateTime and Timezone使用 DateTime 和 Timezone 为每个用户设置相同值的计时器
【发布时间】:2015-09-08 20:49:53
【问题描述】:

我有计时器。我遇到了一个问题,我在几个时区有用户。所以一个人看到他还剩 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);
        }
    }
}

【问题讨论】:

  • 使用 UTC 时间设置计时器 + stackoverflow.com/questions/12046398/… 跟踪时间变化。
  • 你的问题对我来说不是很清楚。请提供几个不同时区用户、用户切换系统时钟等的文字示例以及预期输出。
  • endDate 参数到底是什么?用户设定的目标时间?
  • endDate - 订阅结束时间
  • "但是如果我在 Windows 上更改时间,我的计时器值会更改" - 如果您的意思是更改时间本身而不是时区,则您不能相信本地 Windows 时间来获得这种差异,请注意这一点。查看@AlexeiLevenkov 评论以了解如何跟踪它。

标签: c# datetime timer


【解决方案1】:

将您的 DateTime 对象保持在 UTC:

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

var difference = endDate - now;

如果要向用户显示日期,请将其转换为本地时间,否则,请保持 UTC。

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

How to Query an NTP Server using C#?

这应该会为您提供 UTC 中的 now 值,您可以照常进行 - 无需依赖本地 PC 上的时间。这显然需要 PC 在线。

【讨论】:

  • 如果我在 Windows 中更改时间而不是 var 差异将有其他值
  • 请详细说明您为什么需要这个。如果您想避免让用户“作弊”,则必须使用与计算机时钟不同的时钟。我已经更新了我的答案以反映这一点。
【解决方案2】:

如果 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多