目前,我们有一种以TimeZone感知方式处理.net DateTimes的标准方法:每当我们生成一个DateTimeUTC时(例如使用DateTime.UtcNow),每当我们显示一个时,我们就会从UTC转换回用户的本地时间.
这工作正常,但我一直在阅读DateTimeOffset它如何捕获对象本身的本地和UTC时间.所以问题是,使用DateTimeOffsetvs我们已经做的事情有什么好处?
我正在尝试创建一个单元测试来测试机器上时区变化的情况,因为它已被错误地设置然后更正.
在测试中,我需要能够在非本地时区创建DateTime对象,以确保运行测试的人员无论身在何处都能成功完成.
从我从DateTime构造函数中可以看到,我可以将TimeZone设置为本地时区,UTC时区或未指定.
如何使用PST等特定时区创建DateTime?
大多数网站需要某种方式在用户首选时区显示网站上的日期.下面是我找到的两个列表,然后是PHP 5中使用内置PHP DateTime类的一个方法.
我需要帮助知道在尝试从寄存器上获取用户的UTC偏移量时,哪些是最好尝试使用的.
一:
<option value="-12">[UTC - 12] Baker Island Time</option>
<option value="-11">[UTC - 11] Niue Time, Samoa Standard Time</option>
<option value="-10">[UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time</option>
<option value="-9.5">[UTC - 9:30] Marquesas Islands Time</option>
<option value="-9">[UTC - 9] Alaska Standard Time, Gambier Island Time</option>
<option value="-8">[UTC - 8] Pacific Standard Time</option>
<option value="-7">[UTC - 7] Mountain Standard Time</option>
<option value="-6">[UTC - 6] Central Standard Time</option>
<option value="-5">[UTC - 5] Eastern Standard …Run Code Online (Sandbox Code Playgroud) 我的网站托管在与使用该应用程序的用户不同的时区.除此之外,用户还可以拥有特定的时区.我想知道其他SO用户和应用程序如何处理这个问题?最明显的部分是在DB内部,日期/时间以UTC格式存储.在服务器上时,所有日期/时间都应以UTC格式处理.但是,我看到了我要克服的三个问题:
以UTC格式获取当前时间(轻松解决DateTime.UtcNow).
从数据库中提取日期/时间并将其显示给用户.可能有很多调用在不同视图上打印日期.我在考虑可以解决这个问题的视图和控制器之间的某个层.或者有自定义扩展方法DateTime(见下文).主要的缺点是在视图中使用日期时间的每个位置,必须调用扩展方法!
这也会增加使用类似的东西的难度JsonResult.你不能再轻易打电话了Json(myEnumerable),它必须是Json(myEnumerable.Select(transformAllDates)).也许AutoMapper可以在这种情况下提供帮助?
从用户获取输入(本地到UTC).例如,使用日期发布表单需要将日期转换为UTC.首先想到的是创建一个自定义ModelBinder.
这是我想在视图中使用的扩展:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
Run Code Online (Sandbox Code Playgroud)
考虑到很多应用程序现在都是基于云的,服务器的本地时间可能与预期的时区差别很大,我认为处理时区会是如此常见.
以前优雅地解决了吗?有什么我想念的吗?非常感谢您的想法和想法.
编辑:为了清除一些混乱,我想添加更多细节.现在的问题不是如何在数据库中存储UTC时间,而是更多关于从UTC-> Local和Local-> UTC的过程.正如@Max Zerbini所指出的那样,将UTC-> Local代码放在视图中显然很聪明,但是DateTimeExtensions真的使用了答案吗?当从用户那里获得输入时,接受日期作为用户的本地时间(因为这是JS将使用的)然后使用a ModelBinder转换为UTC是否有意义?用户的时区存储在数据库中,可以轻松检索.
我通常有一个"拦截器",它在从/向数据库读取/写入之前进行DateTime转换(从UTC到本地时间,从本地时间到UTC),因此我可以DateTime.Now在整个系统中使用(派生和比较)而不用担心关于时区.
关于计算机之间的序列化和移动数据,没有必要打扰,因为日期时间始终是UTC.
我应该继续以UTC格式存储我的日期(SQL 2008 - datetime)还是应该使用DateTimeOffset(SQL 2008-datetimeoffset)存储它?
数据库中的UTC日期(日期时间类型)已经工作并且已知很长时间了,为什么要更改它?有什么好处?
我已经看过像这样的文章了,但我并不是100%相信.有什么想法吗?
我正在使用Mongoose,MongoDB和Node.
我想定义一个架构,其中一个字段是date\timestamp.
我想使用此字段以返回在过去5分钟内已更新的所有记录.
由于在Mongoose中我不能使用Timestamp()方法,我理解我唯一的选择是使用以下Javascript方法:
time : { type: Number, default: (new Date()).getTime() }
Run Code Online (Sandbox Code Playgroud)
它可能不是查询庞大数据库的最有效方式.如果有人可以分享一种更有效的方式来实现这一点,我将非常感激.
有没有办法用Mongoose实现这个并且能够使用MongoDB时间戳?
假设有一个重新发生的事件让我们说结束时间总是在同一个本地时间,比如说17:00,无论该时区是否开启夏令时.并且当DST在特定时区打开或关闭时,还要求不要手动更改时间.还要求每当任何其他系统通过API(即GetEndTimeByEvent)询问结束时间时,它总是以UTC格式发送结束时间.
方法1: 如果决定以UTC格式存储,则可以将其存储在数据库表中,如下所示.
Event UTCEndTime
=====================
ABC 07:00:00
MNO 06:00:00
PQR 04:00:00
Run Code Online (Sandbox Code Playgroud)
对于第一个事件ABC,UTC的结束时间是上午07:00,如果转换为从UTC到2012年7月1日当地时间显示,则将在当地时间17:00结束,如果在2012年10月10日转换( DST为时区的开启日期)然后将导致下午6点,这是不正确的结束时间.
我可以想到的一种可能的方法是将DST时间存储在附加列中,并在时区有DST ON时使用该时间.
方法2: 但是,如果它被存储为如下的本地时间,例如对于事件ABC,它将在任何日期始终为17:00,因为没有从UTC到本地时间的转换.
Event LocalEndTime
=======================
ABC 17:00:00
MNO 16:00:00
PQR 14:00:00
Run Code Online (Sandbox Code Playgroud)
应用程序层将本地时间转换为UTC时间,以通过(API GetEndTimeByEvent)发送到其他系统.
在这种情况下,以UTC格式存储时间仍然是个好主意吗?如果是,那么如何获得恒定的当地时间?
相关问题:是否有充分的理由将时间存储在UTC中?
我有数以千计在坦桑尼亚拍摄的照片,我想在MySQL数据库中存储每张照片的日期和时间.然而,服务器位于美国,当我尝试存储坦桑尼亚日期时间时,我遇到问题,该日期时间在春季夏令时期间(在美国)处于"无效"小时内.坦桑尼亚不做DST,所以时间实际上是有效的时间.
其他复杂情况是,来自许多不同时区的合作者需要访问存储在数据库中的日期时间值.我希望他们总是作为坦桑尼亚时间出现,而不是在各个合作者所处的当地时代.
我不愿意设置会话时间因为我知道当有人忘记设置会话时间并且错过时间时会出现问题.而我无权更改服务器的任何内容.
我读过: 夏令时和时区最佳实践和 MySQL日期时间字段和夏令时 - 我如何引用"额外"时间?并 在PHP/MySQL中将日期时间存储为UTC
但它们似乎都没有解决我的特殊问题.我不是SQL专家; 有没有办法在设置DATETIME时指定时区?我还没见过一个.否则,非常感谢任何有关如何处理此问题的建议.
编辑:这是我遇到的问题的一个例子.我发送命令:
INSERT INTO Images (CaptureEvent, SequenceNum, PathFilename, TimestampJPG)
VALUES (122,1,"S2/B04/B04_R1/IMAG0148.JPG","2011-03-13 02:49:10")
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Error 1292: Incorrect datetime value: '2011-03-13 02:49:10' for column 'TimestampJPG'
Run Code Online (Sandbox Code Playgroud)
这个日期和时间存在于坦桑尼亚,但不存在于数据库所在的美国.
几个月前,我被介绍到新型DateTimeOffset,很高兴DateTime关于时区的缺陷终于得到了解决.
但是,我想知道使用这种新类型是否有任何开销或问题.
我在一个多语言环境的Web应用程序上工作.有没有人知道任何可以影响我的东西,只是在我的所有日期/时间工作中使用它?这里有滥用的窗口吗?
参考:DateTimeOffset:Justin Van Patten在.NET 3.5中的一个新的DateTime结构
在.NET中,以下语句返回不同的值:
Response.Write(
TimeZoneInfo.ConvertTime(
DateTime.Parse("2010-07-01 5:30:00.000"),
TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"),
TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"))
);
// displays 7/1/2010 1:30:00 PM
Run Code Online (Sandbox Code Playgroud)
..还有这个...
Response.Write(
TimeZoneInfo.ConvertTime(
DateTime.Parse("2010-07-01 5:30:00.000"),
TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"),
TimeZoneInfo.FindSystemTimeZoneById("UTC"))
);
// displays 7/1/2010 12:30:00 PM
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我认为UTC和GMT标准时间相当.
更新
经过进一步测试,我发现以下内容似乎是等效的:
"世界标准时间"
"格林威治标准时间"
"摩洛哥标准时间"
而在夏季,以下情况有所不同:
"GMT标准时间"
也许我的问题应该是,为什么"格林威治标准时间"和"格林威治标准时间标准时间"有所不同?
结束更新