C# DateTime.Now Web服务器上的区域性/格式
为了进行测试,Web服务器位于具有C# DateTime.Now Web服务器上的区域性/格式,c#,asp.net,.net,datetime,datetime-format,C#,Asp.net,.net,Datetime,Datetime Format,为了进行测试,Web服务器位于具有毛利文化的计算机上,其中短日期格式如下:d/MM/yyyy 用户在一台具有匈牙利文化的计算机上,短日期格式为yyyy.MM.dd. 我已经创建了一个网页,将显示DateTime。现在,当页面加载时,它将显示在标签上。显示的日期为2013年2月18日下午2:22:06 所以现在我的问题是,为什么显示的日期是另一种格式/文化,我怀疑是我们 其次,我需要将数据库中的日期(假设数据库位于具有不同区域性的计算机上)与DateTime.Now进行比较。为此,我计划转换数据库
毛利文化的计算机上,其中短日期格式如下:d/MM/yyyy
用户在一台具有匈牙利文化的计算机上,短日期格式为yyyy.MM.dd.
我已经创建了一个网页,将显示DateTime。现在,当页面加载时,它将显示在标签上。显示的日期为2013年2月18日下午2:22:06
所以现在我的问题是,为什么显示的日期是另一种格式/文化,我怀疑是我们
其次,我需要将数据库中的日期(假设数据库位于具有不同区域性的计算机上)与DateTime.Now进行比较。为此,我计划转换数据库中的日期以匹配Web服务器的区域性。但考虑到我第一个问题中的情况,我如何知道DateTime.Now将采用哪种文化/格式
编辑:使用的代码:
DateTime nowDateTime = DateTime.Now;
Label7.Text = nowDateTime.ToString().Trim();
在比较不同时区的日期时,将其作为UTC存储在数据库中是有意义的。然后,您可以轻松地将其与任何时区的任何其他日期进行比较(再次转换为UTC)
希望这能有所帮助。关于问题的第一部分:您的代码基本上只是使用当前的线程文化。您可以确保将每个请求的当前线程区域性设置为该请求的合适区域性(基于accept标头等-请参阅),也可以将其显式传递给对ToString
等的所有调用
至于为什么它会以美国英语的格式出现——这很可能是web服务所运行的文化。这很可能与桌面使用的文化不同。您应该尽力确保不使用该选项,除非在用户请求未提供任何信息时可能用作备用选项。(我倾向于选择一个明确的回退,而不是为服务使用默认值。)
其次,我需要将数据库中的日期(假设数据库位于具有不同区域性的计算机上)与DateTime.Now进行比较
使用DateTime.Now
几乎肯定是个坏主意。在大多数情况下,您应该使用DateTime.UtcNow
并在数据库中存储UTC日期/时间。(有些情况下,您应该存储本地时间和时区,但即使这样,您也不会使用DateTime.Now
)
为此,我计划转换数据库中的日期以匹配Web服务器的区域性。但考虑到我第一个问题中的情况,我如何知道DateTime.Now将采用哪种文化/格式
在转换字符串表示形式和从字符串表示形式转换时,区域性主要是相关的。在数据库中存储或检索值时,应避免任何此类转换。相反,请确保您在数据库中使用了适当的字段类型(DATETIME
或其他类型),然后将其作为数据访问层中的DATETIME
获取。如果您发现自己试图使用DateTime.Parse
或任何类似的方法,这应该会敲响警钟。您还没有告诉我们您使用的是什么数据访问技术,但几乎所有内容都允许您直接检索DateTime
。(例如)根据您的编辑,我认为相关主题中的文化不是真正的毛利文化。请尝试以下测试:
Label7.Text = CultureInfo.CurrentCulture.ToString();
如果它是“mi”
或“mi NZ”
,它就是毛利人。带有“en”
的东西可能是英语、“hu”
匈牙利语,等等
请注意,如果以编程方式更改当前区域性,则仅影响当前线程。而不是其他线程。但是您是否尝试在Windows的控制面板中设置区域设置
为什么显示的日期是另一种格式/文化,我怀疑是我们
回答:DateTime。现在在标签上呈现2/18/2013 2:22:06 PM
的已经是Maori
英语文化,这可能是由于当前的web服务器配置或它正在选择用户的请求文化
可能的解决办法:
以客户文化(即匈牙利文化)呈现
最简单的和框架句柄,修改配置以适应用户的请求头
手册,您需要为此编写代码,您需要处理页面的初始化文化事件,并根据用户的请求头接受语言更改文化以执行HttpRequest
,这应该类似于接受语言:hu hu,en;q=0.8
上面1点的代码示例
为此,请参考哪些概念也可以应用于Web表单应用程序
要读取数据库值,请使用代码段作为
请参阅:并且我们无法告诉您为什么在没有看到任何代码的情况下使用特定的区域性。@Jon Skeet事实上,代码非常简单。我已经编辑了我的问题以添加代码。我同意这很简单,但它仍然是必要的信息:)我已经相应地编辑了我的答案。@ixora我帮你了吗?很抱歉回复太晚。根据你的解释,我花了些时间来解决这个问题,最终忘记了回答。谢谢你的解释。我检查了当前的线程文化,它真的很适合我们。根据你的解释,我设法解决了这个问题。在保存到数据库时,我使用这种格式“yyyyMMdd H:mm:ss”。在比较日期时,我会在比较之前将日期转换为web服务器的格式和区域性them@ixora:保存到数据库或进行比较时,为什么要使用任何格式?正如我试图明确指出的,如果您能帮助的话,您根本不应该使用字符串表示法-尽快转换为DateTime
,然后坚持使用。谢谢您的回复。我这么做了,上面写着我们。难怪!:我在控制面板上设置了区域,不是通过编程,而是通过
var culture = CultureInfo.CreateSpecificCulture("mi-NZ");
DateTime.Parse(sqlDbReader["MyDateColumnName"], culture)