You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

区域设置变更时如何固定DateTimePicker的指定24小时制时间格式

解决方案

问题根源

  • 你的现有逻辑本身违背了「固定顺序不受区域影响」的需求:通过判断区域名称切换两种格式,自然会随区域变化显示不同的时间顺序。
  • 阿拉伯语等右到左(RTL)区域下,DateTimePicker默认会跟随系统适配RTL布局,自动翻转内容显示顺序,即使你写了固定格式也会被调整。
  • 格式占位符默认受当前线程文化影响,比如:会被替换为对应区域的时间分隔符,tt会被翻译为对应区域的上午/下午标识。

修复代码

不需要做任何区域判断,直接按你需要的固定顺序设置格式,同时关闭RTL适配即可:

' 固定使用自定义格式
ROSYUPDATE_F.DateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom
' 关闭RTL适配,避免右到左区域翻转内容顺序
ROSYUPDATE_F.DateTimePicker.RightToLeft = System.Windows.Forms.RightToLeft.No
' 单引号包裹冒号固定为英文冒号,不会随区域变化;按你要的顺序写格式即可
' 如果不需要AM/PM(纯24小时制),直接写 "HH':'mm" 即可
ROSYUPDATE_F.DateTimePicker.CustomFormat = "HH':'mm tt"
' 如果你需要固定AM/PM显示为英文,不随区域变成其他语言,用以下代码替换上面的CustomFormat设置
Dim invariantCulture = System.Globalization.CultureInfo.InvariantCulture
ROSYUPDATE_F.DateTimePicker.CustomFormat = $"HH':'mm '{If(DateTime.Now.Hour >= 12, invariantCulture.DateTimeFormat.PMDesignator, invariantCulture.DateTimeFormat.AMDesignator)}'"

如果需要在时间变化时自动更新AM/PM的英文标识,额外绑定ValueChanged事件处理即可:

Private Sub DateTimePicker_ValueChanged(sender As Object, e As EventArgs) Handles ROSYUPDATE_F.DateTimePicker.ValueChanged
    Dim dtp As DateTimePicker = CType(sender, DateTimePicker)
    Dim invariantCulture = System.Globalization.CultureInfo.InvariantCulture
    dtp.CustomFormat = $"HH':'mm '{If(dtp.Value.Hour >= 12, invariantCulture.DateTimeFormat.PMDesignator, invariantCulture.DateTimeFormat.AMDesignator)}'"
End Sub

内容的提问来源于stack exchange,提问作者fast2021

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 18:12:03