C#日期格式不显示本地格式

3

在我的本地机器上,Thread.CurrentThread.CurrentCulture返回正确的本地文化(en-GB),日期格式设置为yyyy-MM-dd。

在代码中,当我运行以下命令时:

value.ToShortDateString()

它返回了"6/2/2010"(m/d/yyyy)。

我该如何使其根据本地文化显示?我不想硬编码格式,因为该应用程序将部署在不同的国家/地区,所以它应该根据本地PC设置进行工作。我已经在en-US上进行了测试,但它显示相同的内容。

'value'变量的值为:

{6/2/2010 12:00:00 AM}
    Date: {6/2/2010 12:00:00 AM}
    Day: 2
    DayOfWeek: Wednesday
    DayOfYear: 153
    Hour: 0
    Kind: Unspecified
    Millisecond: 0
    Minute: 0
    Month: 6
    Second: 0
    Ticks: 634110336000000000
    TimeOfDay: {00:00:00}
    Year: 2010

value.ToShortDateString() 返回动态格式,取决于本地桌面配置。请查看我的答案以获取更多解释。 - mkkhedawat
我不明白你的问题。你说你的 CurrentCultureen-GB,并且问“如何根据本地文化显示它?”你已经使用了 ToShortDateString 来实现了这一点。你到底想要什么结果?是以 yyyy-MM-dd 格式呈现吗?而 m 指定符是用于分钟,M 指定符是用于月份。格式指定符区分大小写。 - Soner Gönül
@Soner:ToShortDateString返回美国格式6/2/2010。我希望它能根据当地文化返回,即2010-06-02。 - Cameron Castillo
4个回答

3
只需调用ToString()而不是ToShortDateString(),并指定您的日期格式:
    DateTimeFormatInfo formatInfo = CultureInfo.CurrentUICulture.DateTimeFormat;
    var value = DateTime.Now.ToString(formatInfo);

尽管根据文档(链接1)ToShortDateString()应该是与文化相关的:

当前 DateTime 对象的值使用与当前线程文化关联的 DateTimeFormatInfo.ShortDatePattern 属性定义的模式进行格式化。返回值与使用 ToString(String) 方法指定“d”标准 DateTime 格式字符串返回的值相同。

但是,如果当前区域设置和当前用户界面区域设置不同,则可能返回错误的格式。为了安全起见,在代码示例中我使用了 CurrentUICulture,因为它基于用户的 UI 文化设置 - 例如,在美国系统上使用英国语言包等,并且应该是正确的。


Tx - 我可能应该在问题中提到,但它需要根据文化动态变化。当我们在其他国家部署时,我们不希望它被硬编码。我会更新问题。 - Cameron Castillo
@user1208908 已更新答案以考虑此事。 - aevitas
我尝试了你的解决方案,它返回的是“2015年4月22日下午2:43:01”,仍然是美国格式。 - Cameron Castillo
@user1208908 你的CurrentUICulture设置为什么?是en-US还是en-UK? - aevitas
@user1208908 奇怪,DateTimeFormatInfo formatInfo = new CultureInfo("en-GB").DateTimeFormat; 使用该CultureInfo的 DateTime.Now.ToString 对我来说返回了(正确的)日期:22/4。 - aevitas
它将返回正确的格式,因为文化是硬编码的,这对我来说不是一个选项。 - Cameron Castillo

1

在您的ToString()中指定文化:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

1
该解决方案返回“2014年2月18日上午12:00:00”。仍然是错误的格式。 - Cameron Castillo

1
"ToShortDateString" 方法应该具有区域敏感性 - 它使用的格式由当前文化的 "DateTimeFormatInfo" 对象控制。您是否检查过这是否符合您的预期?(这实际上应该是一条注释,因为它并不是一个确定的答案/修复 - 不幸的是,我没有足够的声望进行评论。)"

这是我根据阅读此链接准备提交的内容。赠送一枚点赞为您开启评论之路... - Wizard
非常感谢,万岁-十分感谢。 - amcdermott

0
一个简单的调用 ToShortDateString() 将采取局部桌面输入格式。 它将根据本地 Windows 桌面配置显示日期字符串。
  • 如果本地配置为 15/4/22(yy/m/dd),输出将为 15/4/22
  • 如果本地配置为 4/22/2015(m/dd/yyyy),输出将为 4/22/2015
局部配置可以在更改日期和时间设置 >> 更改日历设置 >> 更改日期格式下更改。 (当我提到本地配置时,我的意思是在 Windows 任务栏右下角显示的日期格式。)

嗯,这就是它应该工作的方式,也是问题的部分原因。它不以那种格式显示日期。 - Cameron Castillo
你使用的是哪个 .net 版本?在我的地方它正好按照描述的方式工作。 - mkkhedawat
Visual Studio 专业版 2013 - Cameron Castillo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接