区域设置变更时如何固定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
相关产品推荐
相关产品推荐

