Tag: timezone

时区战略

我正在构建一个MVC 3应用程序,其中用户可能不在同一时区,因此我的意图是以UTC格式存储所有内容,并在视图中将UTC转换为本地时间,并在提交时将本地时间转换为UTC。 做一些浏览虽然似乎没有很多好的解决方案。 说实话,我有点期望一个属性可用于将UTC时间自动转换为本地时间,但似乎不存在。 我觉得只是努力将每个输入手动转换为UTC并手动将每个视图转换为本地时间显示将非常容易出错并导致难以检测到时间未转换为或未转换的错误。 关于如何将此作为一般战略处理的任何建议? 编辑每个人似乎都非常坚持“如何获得客户端时区”这篇文章,正如我在其中一条评论中提到的那样,并不是我关注的问题。 我很好用一个用户设置确定他们的时区,所以假设我已经知道客户端时区是什么…这不能解决我的问题。 现在,在我渲染日期的每个视图上,我需要调用一个方法从utc在本地时区渲染它。 每次我向服务器发送提交日期时,我都需要将其从本地时区转换为UTC。 如果我忘记这样做会有问题…提交的日期将是错误的或客户端报告和filter将是错误的。 我希望存在的是一种更自动化的方法,特别是因为视图模型在MVC 3中是强类型的,我希望sum magic能够至少自动在时区中呈现,如果不处理提交,就像日期格式或范围可以由属性控制。 所以喜欢 [DateRange] Public DateTime MyDate 我可以有类似的东西 [ConvertToUTC(offset)] Public DateTime MyDate 无论如何,我想我的唯一方法就是编写自定义数据注释以在时区中呈现它,并在MVC 3模型绑定器上覆盖,以便转换传入日期,除非我想在方法中包装任何日期呼叫。 因此,除非有人有进一步的意见或建议,否则它将是这两个选项中的一个,我只是惊讶于已经不存在的事情。 如果我确实实施了解决方案,我一定会发布它。 编辑2像这样的http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx用于MVC 3视图和视图模型是我正在寻找的。 最终编辑我将epignosisx的答案标记为正确,但也有一些评论要添加。 我在这里找到了类似的东西: http : //dalldorf.com/blog/2011/06/mvc3-timezones-1/通过将时区放在cookie中为第2部分中需要的人提供时区的实现(链接如下,因为文章第一部分到第2部分的链接不起作用) http://dalldorf.com/blog/2011/09/mvc3-timezones-2/ 重要的是要注意这些方法,你必须使用Editfor和Displayfor而不是TextForFor之类的东西,因为只有EditFor和DisplayFor使用元数据提供程序来告诉MVC如何在模型上显示该类型的属性。 如果直接在视图中访问模型值(@ Model.MyDate),则不会进行转换。

DateTime.Now和Culture / Timezone特定

我们的应用程序旨在处理来自不同地理位置的用户。 我们无法检测当前最终用户当地时间和时区对其进行操作的情况。 他们选择不同的文化,如sv-se,en-us,ta-In甚至他们从欧洲/伦敦时区访问.. 我们在美国的托管服务器中托管它,应用程序用户来自Norway/Denmark/Sweden/UK/USA/India 问题是我们使用DateTime.Now来存储记录创建/更新日期等。 由于服务器在美国运行,所有用户数据都保存为美国时间:( 在SO中研究之后,我们决定将所有历史日期存储在DB中作为DateTime.UtcNow 问题: 在29 Dec 2013, 3:15 PM Swedish time创建了一条纪录。 public ActionResult Save(BookingViewModel model) { Booking booking = new Booking(); booking.BookingDateTime = model.BookingDateTime; //10 Jan 2014 2:00 PM booking.Name = model.Name; booking.CurrentUserId = (User)Session[“currentUser”].UserId; //USA Server runs in Pacific Time Zone, UTC-08:00 booking.CreatedDateTime = DateTime.UtcNow; //29 Dec 2013, 6:15 AM […]

在C#中计算重复日期的正确方法

在我的项目中,我需要计算重复事件的日期。 一开始我只有一个开始日期/时间以及该事件必须重复的信息: Every Day Every Week Every 2 Weeks Every 3 Weeks Every Month Every 2 Months … 这样做的正确方法是什么? 它应该可以正常使用不同的时区和日节省时间设置。 我想我应该将日/周/月添加到本地DateTime,然后将其转换为UTC。 但我不确定这一点。 如果我添加几天会发生什么,这将是我们需要向前调整我们的时钟一小时的时间。 在这种情况下,此时间不存在。 下面是我写的代码,但我不确定它在每种情况下都能正常工作: private static List FindOccurrences(DateTime localStart, Repeat repeat, int occurrences) { var result = new List { localStart }; switch (repeat) { case Repeat.Daily: for (int i = 1; i <= […]

如何通过UTC偏移确定时区?

我有一个场景,我有一个时区偏移(以分钟为单位),需要确定它的时区。 我知道所有数据都不可用(例如,可能有几个时区的偏移量为-240分钟),但“最佳猜测”是可以接受的。 我的第一次传球看起来像这样: foreach (var info in TimeZoneInfo.GetSystemTimeZones()) { if (info.BaseUtcOffset.TotalMinutes == timezoneOffset) { // do something here if this is a valid timezone } } 这种方式有效,但我需要考虑夏令时,这有点让我失望。 我添加了这个可怕的黑客: foreach (var info in TimeZoneInfo.GetSystemTimeZones()) { var extra = info.IsDaylightSavingTime(DateTime.Now) ? 60 : 0; if (info.BaseUtcOffset.TotalMinutes + extra == timezoneOffset) { // do something here if this […]

在数据库中将日期/时间存储为UTC

我将数据库中的日期/时间存储为UTC,并根据特定时区将它们在我的应用程序中计算回本地时间。 比方说我有以下日期/时间: 01/04/2010 00:00 比如说它是一个国家,例如英国,它遵守DST(夏令时),在这个特定的时间,我们在夏令时。 当我将此日期转换为UTC并将其存储在数据库中时,它实际存储为: 31/03/2010 23:00 因为DST的日期将调整为-1小时。 当您在提交时观察DST时,此工作正常。 但是,当时钟调整回来时会发生什么? 当我从数据库中提取该日期并将其转换为当地时间时,特定日期时间将被视为31/03/2009 23:00 ,而实际上它被处理为01/04/2010 00:00 。 如果我错了,请纠正我但是在存储UTC时间时这不是一个缺陷吗? 时区转换的示例 基本上我正在做的是存储信息提交到我的系统的日期/时间,以便允许用户进行范围报告。 这是我存储日期/时间的方式: public DateTime LocalDateTime(string timeZoneId) { var tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi).ToUniversalTime().ToLocalTime(); } 存储为UTC: var localDateTime = LocalDateTime(“AUS Eastern Standard Time”); WriteToDB(localDateTime.ToUniversalTime());

按国家和地区获取时区

我正在开发一个在C#/ .NET平台上发送应用程序的新闻通讯。 我最近添加了模块,使用maxmind.com数据库通过IP地址检索收件人的国家和地区。 例如,我可以获得一些示例IP地址的以下信息: Country Code: DE Country Name: Germany Region Name: Hessen City: Frankfurt Am Main Latitude: 50.1167 Longitude: 8.6833 我现在需要的是使用此信息获取用户的时区。 我知道有一些GeoIp数据库也提供了时区,但我需要使用这个具体的GeoIp数据库。 此外,这里不能使用javascript确定时间偏移的方法。 可能我可以使用国家和地区名称以某种方式获得时区?

将UTC DateTime转换为另一个时区

我有来自数据库记录的UTC DateTime值。 我还有一个用户指定的时区(TimeZoneInfo的一个实例)。 如何将UTC DateTime转换为用户的本地时区? 另外,如何确定用户指定的时区当前是否正在观察夏令时? 我正在使用.NET 3.5。 谢谢,马克

ConvertTimeFromUtc()和ToUniversalTime()是否处理​​DST?

如果夏令时生效,并且日期对象已保存到数据库中(UTC格式),您将检索该数据库以在视图中显示它(例如asp.net-mvc的视图)。 你通过使用这种方法来做到这一点: public static DateTime ConvertToLocalTimeFromUtcTime(DateTime utcDate, string timeZoneId) { TimeZoneInfo localZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(utcDate, localZone); if (localZone.IsDaylightSavingTime(localTime)) localTime = localTime.AddHours(1); // is this needed !? return localTime; } 问题是, TimeZoneInfo.ConvertTimeFromUtc()处理DST,或者您是否必须自己检查并向日期对象添加或减去X小时? 通过使用ToUniversalTime()将日期对象转换为UTC格式来将日期对象持久化到数据库时的相同问题。

防止对DateTime值进行反序列化时的时区转换

我有一个类,我使用XmlSerializer序列化/反序列化。 该类包含DateTime字段。 序列化时, DateTime字段由包含GMT偏移量的字符串表示,例如2010-05-05T09:13:45-05:00 。 反序列化时,这些时间将转换为执行反序列化的机器的本地时间。 由于不值得解释的原因,我想阻止这种时区转换的发生。 序列化发生在野外,其中存在此​​类的多个版本。 反序列化发生在我控制的服务器上。 因此,似乎在反序列化期间最好处理这个问题。 除了实现IXmlSerializable并“手动”执行所有反序列化之外,我怎样才能实现这一点?

获取一个国家/地区的默认时区(通过CultureInfo)

是否有为每个国家/地区提供默认时区的计划或表格? 是的,美国,加拿大和俄罗斯有多个时区。 (我认为每个其他国家只有一个。)但如果一个国家知道而不是仅仅提供从格林威治标准时间开始的清单,那么最好开始。 最好是在C#中,但我会把它带入任何东西并转换为C#。