即使在 Java 中未选中 Systems Daylight 选项,也始终使用 Java 中的夏令时获取时区
Posted
技术标签:
【中文标题】即使在 Java 中未选中 Systems Daylight 选项,也始终使用 Java 中的夏令时获取时区【英文标题】:Get timezone always with Daylight time saving On in Java even if Systems Daylight option is unchecked in java 【发布时间】:2019-02-24 17:06:46 【问题描述】:我正在尝试使用 Java 读取 Timezone
String timeZone = TimeZone.getDefault().getId();
如果启用夏令时,它会给我正确的Timezone
,但如果它被禁用,它会给我 GMT 的结果。我希望不会得到 GMT,与系统设置无关。
Java 中是否有办法始终将 DST 的结果设为 ON?
例如 转到系统(Windows)-> ChangeDateandTimeSettings -> Change Timezone -> Set Timezoene to UTC+00:00 Dublin,Edinburg,Lisbon,London 现在运行上面的代码并检查自动调整系统时间,你会得到结果 "Europe /London" 现在禁用您获得结果为 GMT 的复选框,在这两种情况下,我都希望结果为 Europe/London
【问题讨论】:
您究竟如何称呼“启用/禁用”夏令时?在 Java 中禁用 DST,您采取了哪些措施,非常非常准确? 我说,“非常非常准确”。我的意思是,非常非常准确。描述您单击的位置和键入的内容。屏幕截图可能会有所帮助 (1) 我无法复制。我将默认时区设置为非洲/摩加迪沙,你的代码给了我——非洲/摩加迪沙,没有提到 DST。然后我将它设置为 America/Santiago 并得到 America/Santiago。 (2) 为什么要让 DST 始终开启?那会有什么意义? (3) 请发布兼容的代码。我得到“TimeZone 类型的方法 getId() 未定义”。 只是你可以更清楚。 “系统(Windows)”没有任何意义。您可以说“这是在 Windows 操作系统上。我启动名为 System 的 Windows 程序(单击 Windows 开始菜单,在程序搜索栏中键入 System)”。没有“ChangeDateandTimeSettings”之类的东西。您可以说“转到导航栏中的控制面板,然后在菜单时钟、语言和区域中,然后选择更改时区” “在这两种情况下,我都希望结果为 Europe/London” - 但是您实际上不会看到系统正在观察的时区。 Europe/London 在 IANA 数据库中具有特定含义,其中包括 DST。当您禁用 DST 时,您实际上是在说“我不想使用正常的时区规则”——因此您的系统实际上不再位于欧洲/伦敦地区。 Java 正确表示系统时区。 (嗯,有点。如果时区改变标准时间,我不确定甚至应该如何处理......) 【参考方案1】:也许你可以尝试获取某个时期的天数。
以下方法查找期间开始日期到期间结束日期之间的天数。这意味着开始日期被计算为期间内的天数,而不是结束日期。例如,1 月 1 日至 1 月 10 日总共包括 9 天。此方法会考虑夏令时,以确保跨 DST 边界正确计算天数。
例如,
import org.joda.time.Days;
import org.joda.time.LocalDate;
// …
public int getDaysInPeriod()
final LocalDate start;
final LocalDate end;
final int daysInCycle;
if (end.isBefore(start) || end.isEqual(start))
return 0;
return Days.daysBetween(start, end).getDays();
希望这会有所帮助。
【讨论】:
感谢您的贡献。那只是我吗?我看不出问题和这个答案之间的联系。以上是关于即使在 Java 中未选中 Systems Daylight 选项,也始终使用 Java 中的夏令时获取时区的主要内容,如果未能解决你的问题,请参考以下文章
DOM 中未更新默认选择选项,即使 v-model 属性正在更新
Java中未处理的异常错误,即使使用try-catch也是如此