用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
对象在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);
}
}