【问题标题】:Exact date and time format of DateTimePickerDateTimePicker 的确切日期和时间格式
【发布时间】:2012-05-28 07:44:21
【问题描述】:

this article我知道,那个DateTimePicker控件不反映CurrentUICulture
那么,我怎样才能获得它所使用的真实文化?我需要在多语言应用程序中获取 DateTimePicker 的字符串值,但 完全 格式与用户在表单上看到的格式相同(不,我无法设置“硬编码”自定义格式)。

示例:
当我使用本地波兰语设置在 Windows 上工作时,对于 LongTime,它是:HH:mm:ss 并且 DateTimePicker 中的时间显示为:09:26:50

现在,当我想在我的应用程序中选择不同的语言并在表单的构造函数中将文化设置更改为 US 时:

...
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
System.Threading.Thread.CurrentThread.CurrentUICulture = ci;

InitializeComponent();
....

然后

MessageBox.Show(System.Globalization.DateTimeFormatInfo.CurrentInfo.LongTimePattern);

显示,新的时间格式为:h:mm:ss tt,但 DateTimePicker 仍在显示:09:26:50

当我尝试获取时间字符串时:

dateTimePicker1.Value.ToLongTimeString()

dateTimePicker1.Value.ToString(System.Globalization.DateTimeFormatInfo.CurrentInfo.LongTimePattern)

然后时间显示为:9:26:50 AM

所以我的问题是 - 我怎么知道 DateTimePicker 仍在使用系统的 CultureInfo("pl-PL") 或者它的显示格式是:HH:mm:ss ?

【问题讨论】:

标签: c# format globalization datetimepicker


【解决方案1】:

DateTimePicker 是本机 Windows 控件。它使用在控制面板 + 区域和语言小程序中配置的时间格式。在我的机器上看起来像这样(我住在美国):

因此,您可以通过存储 Thread.CurrentCulture 值在更改它之前来了解它使用什么格式。

请注意,更改 UI 线程的文化是一件非常危险的事情。问题是程序中的任何其他线程,尤其是很少的线程池和 I/O 完成线程,仍然使用机器的默认区域性运行,如上面屏幕截图中的“管理”选项卡中配置的那样。这可能会导致难以发现的细微错误。就像在 UI 线程上创建的 SortedList 突然不再在工作线程中排序一样。 .NET 4.5 将通过添加 CultureInfo.DefaultThreadCurrentCulture 和 DefaultThreadCurrentUICulture 属性来解决此问题。

请放心,您的程序几乎没有用户真正希望以与其机器设置和母语不匹配的语言运行它。在您的 UI 中提供语言更改选项是一个演示功能,实际上并没有被使用。

【讨论】:

  • 这是开始的东西......但是,我需要在.dll中的一个类中,它将附加到其他项目,所以恐怕我无法访问语言改变的地方。除非我强迫它的用户为班级提供“默认”文化——这是一些解决方案。如果我能以某种方式“绕过”.NET 文化并进入控制面板中设置的文化,那最好...
  • 好吧,你可以利用我警告过你的大问题。启动一个小助手线程,它的文化将是系统默认值。击败调用 GetSystemDefaultLCID :)
  • 这是个好建议。但是如果你启动一个辅助线程,你确定它不会继承创建它的线程的文化吗?在我看来,pinvoke(顺便说一句,在 Vista/W2K8 上还有 GetSystemDefaultLocaleName)似乎比多线程方法更简单。
  • @Clafou - 不,如果这可行,那么我就不会警告大问题了。文化不会在 Thread.ExecutionContext 中流动
猜你喜欢
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2010-09-10
相关资源
最近更新 更多