我和我的同事在辩论中陷入僵局,非常感谢其他人的意见。
我们利用服务定位器模式和一个公共(public)接口(interface)来抽象我们所有的数据访问,这样我们就可以随着需求的变化轻松地在不同的数据源之间进行交换。我们的调用代码没有指示数据存储在何处或如何存储。它只是通过服务注册表提供的服务访问数据。
当我们在对象上有 DateTime 字段并将其存储到 MongoDB 数据源时,我们正在讨论的问题就出现了。
我注意到,当我们在 C# 中有一个带有 DateTime 的对象时,它显示为正确的时间。当我们使用 MongoVUE 登录我们的 MongoDB 服务器以检查对象时,它会显示正确的时间。但是当我们检索对象时,日期时间现在是 UTC。将内存中的日期时间与从 MongoDB 数据源检索到的对象中的日期时间进行比较时,这显然会产生问题。
我知道 Mongo 在内部将 DateTime 存储为 UTC 时间。我什至理解为什么当您调用它时它可能会返回 UTC。
辩论从这里开始。
有人认为这只是一个表面问题,只是显示日期时的问题。因此,我们应该简单地在接口(interface)层中调用 .ToLocalTime。我不同意并断言这会危险地破坏我们在实现服务定位器模式时创建的抽象层。它还提出了有关与这些日期时间交互的问题,因为它涉及触发其他事件。
我在其他地方读到的是,我们应该将时间存储为字符串,特别是 UTC 格式的某种标准。以这种方式,接口(interface)层不知道或不关心 DateTime 是如何存储的,我们的对象也不知道或不关心,因为每个数据源都会以相同的方式存储该字符串。
我已经成功地使用 ISO 1806 格式完成此操作,但我的同事认为这是一个“hacky”修复,使用 .toLocalTime 是处理这种情况的合适方法。
我对其他人对这个话题的看法很感兴趣。
预先感谢您的输入。
最佳答案
为什么不首先将 UTC 存储在数据库中?在大多数情况下,DateTime 应该存储为 UTC,因为它通常指的是一个时间点。这适用于任何在物理意义上指代时间的事物,以及任何假定时间是单调的、递增的和唯一的事物,但对于大多数本地时间而言,这些都不是真的。
有时候,使用本地时间确实有意义:假设一辆公共(public)汽车每天早上 9 点发车。这意味着两个连续事件之间相隔 24 小时。但是,如果时区有夏令时,则每年一次分别为 23 小时和 25 小时。
但是,如果您需要处理此类数据,简单的 DateTime 无法解决问题; DST 规则可以更改,时区可以更改等。在 C# 中,将应用的 DST 规则是当前有效的规则,即使日期是“历史”。因此,具有历史日期的日期算法可能会造成严重破坏。如果你真的需要处理这个问题,至少,你应该存储时间所在的哪个时区(不仅是偏移量,甚至只是一个 isLocal 标志) .
在数据库中存储可以二进制存储的文本信息对我来说似乎不是很优雅,在某些中间层更改值也不是。前者效率低下并且存在前面提到的本地时间的特殊性,后者只有第二个问题。
顺便说一句,要完成后者,您可以使用 [BsonDateTimeOptions(Kind=DateTimeKind.Local)] 装饰属性,这将为您进行转换,但会遇到同样的问题,当然。
关于c# - 处理与服务定位器模式一起使用时 MongoDB 如何存储 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8438219/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b