我将日期/时间作为 UTC 存储在数据库中,并在我的应用程序中根据特定时区将它们计算回本地时间。比如说我有以下日期/时间:
01/04/2010 00:00
说它是针对某个国家的,例如英国遵守 DST(夏令时),在这个特定时间我们处于夏令时。当我将此日期转换为 UTC 并将其存储在数据库中时,它实际上存储为:
31/03/2010 23:00
由于夏令时的日期将调整为 -1 小时。当您在提交时观察 DST 时,这很好用。然而,当时钟向后调整时会发生什么?当我从数据库中提取该日期并将其转换为本地时间时,特定日期时间将被视为 31/03/2010 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());
最佳答案
您不会根据您是否当前观察它们来调整 DST 更改的日期 - 您根据 在您描述的瞬间是否观察到 DST 来调整它。因此,对于一月份的情况,您不会应用调整。
但是, 有一个问题 - 一些本地时间不明确。例如,英国 2010 年 10 月 31 日凌晨 1:30 可以表示 UTC 01:30 或 UTC 02:30,因为时钟从凌晨 2 点回到凌晨 1 点。您可以从以 UTC 表示的任何瞬间转换为将在该瞬间显示的本地时间,但该操作不可逆。
同样,您很可能会有一个从未出现过的本地时间 - 例如,2010 年 3 月 28 日的凌晨 1:30 并没有出现在英国 - 因为在凌晨 1 点,时钟会向前跳到凌晨 2 点。
总而言之,如果您试图表示一个瞬间,您可以使用 UTC 并获得明确的表示。如果您试图表示特定时区的时间,则需要时区本身(例如欧洲/伦敦)以及即时的 UTC 表示或具有该特定时间偏移量的本地日期和时间(以消除 DST 转换的歧义)。另一种选择是只存储UTC和它的偏移量;这让你可以知道那一刻的本地时间,但这意味着你无法预测一分钟后的本地时间,因为你并不真正知道时区。 (基本上,这就是 DateTimeOffset 存储的内容。)
我们希望在 Noda Time 中让这件事变得相当容易处理,但您仍然需要意识到它是一种可能性。
编辑:
您显示的代码不正确。这就是为什么。我更改了代码的结构以使其更易于查看,但您会看到它执行相同的调用。
var tzi = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
var aussieTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
var serverLocalTime = aussieTime.ToLocalTime();
var utcTime = serverLocalTime.ToUniversalTime();
那么,让我们考虑一下现在 - 我本地时间 13:38(伦敦 UTC+1)、UTC 12:38、悉尼 22:39。
您的代码将提供:
aussieTime = 22:39 (correct)
serverLocalTime = 23:39 (*not* correct)
utcTime = 22:39 (*not* correct)
您不应该在 TimeZoneInfo.ConvertTimeFromUtc 的结果上调用 ToLocalTime - 它会假定它是在 UTC 上调用的DateTime(除非它实际上有一种 DateTimeKind.Local,在这种情况下它不会)。
因此,如果您在这种情况下准确保存了 22:39,则您没有准确保存 UTC 中的当前时间。
关于c# - 在数据库中将日期/时间存储为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2580478/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha