请帮助。欢迎任何建议。愿意为任何正确的做出小额捐款,并牵着我的手来度过这场危机。
第一,这一切都开始了,我们使用了一个使用东部时区的专用服务器来保存这个结构中的事件:
public class Event
{
DateTime StartTime {get;set;}
DateTime EndTime {get;set;}
}
然后用户会选择时间和日期(从东部时间)并发布到我们的服务器,如下所示:
public Save(DateTime start,DateTime end)
{
//I now save it to UTC time, Why save it as UTC idk, I was told it was the best way to save //time and dates in c#
var newEvent = new Event{StartTime = start.ToUniversalTime() ,EndTime=end.ToUniversalTime()};
_dependcyInjector.Save(newEvent);
}
足够简单吧?所以让我们回顾一下我们有一个事件对象。在网站上,用户会在东部时间发布新的日期和时间,我们会在通用时间保存它。
好的,现在这里的东西开始袭击范。我们将所有内容从EST上的专用服务器移动到基于UTC的Azure站点。所以现在所有节省下来的事件都是不同的意思,当我调用start.UniversalTime()时,它们并没有保存在我认为是普遍时间的事物中。现在甚至更糟糕的是,我们提供的服务可以解决现在被破坏的事件,例如:
public void KickoffEvents()
{
var now = DateTime.UtcNow;
//This use to work perfectly, now it doesnt because of the Azure server time, I am not even //sure what time its try to compare it to anymore.
var events = (from x in Events where x.StartTime < now select x).ToList();
MoveEvents(events[0]);//Just example
}
所以最重要的问题是,我需要帮助的是:
我调查了TimeDateOffset,但我感到很困惑。我们非常感谢任何帮助,我们下周将举办第一场活动,我完全迷失了。
答案 0 :(得分:3)
当您调用“start”和“end”DateTime对象的ToUniversalTime()方法时,该方法将时间从本地时间转换为UTC(假设DateTime.Kind设置为Unspecified,在这种情况下,它是)。因此,在切换服务器之前,它的工作原理是因为服务器的时区恰好与您想要转换的时区相同。
但是,现在服务器的时区已更改,因此在保存DateTime对象时必须以不同的方式切换时区。试试这个
TimeZoneInfo tzInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var newEvent = new Event{StartTime = TimeZoneInfo.ConvertTimeToUtc(start, tzInfo)
,EndTime=TimeZoneInfo.ConvertTimeToUtc(end, tzInfo)};
答案 1 :(得分:0)
根据question and accepted answer:
根据Windows Azure团队博客 - 所有时间 计算/显示等已移至UTC https://azure.microsoft.com/en-us/blog/moving-to-coordinated-universal-time-utc/
这意味着您需要将UTC转换为EST以进行显示:
TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime easternTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, easternZone);
然后再回来保存。
答案 2 :(得分:0)
保存活动是什么意思?
在服务器上,日期与您希望它们的外观相似。举个例子。
您可以在美国东部时间早5点确认Azure服务器上的日期吗?我们现在不是夏令时,所以5点是正确的号码。
您是否阅读了我昨天发布的答案? 我在佛罗里达州BTW。为了使您的系统正确,您可能需要决定策略,然后更新所有旧日期,以便一切正常。如果可以,我会帮助你的。
我从未使用过Azure。我知道这是一个很大的共享服务器农场。他们是为您提供终端访问还是基于网络?尝试拨打TimeZoneInfo.Local.BaseUtcOffset;
。如果服务器配置为UTC时间,我希望它返回00:00:00。