Java中的时区
这可能是一个非常基本的问题,但我找不到任何满意的答案,希望我的疑问在这个问题上得到澄清 问题1假设我的时间在不同的时区,我想将它转换为不同的时区,那么用Java怎么做? 问题2有没有办法使用JavaScript获取时区? 问题3时区只是某个特定区域内时间的表示,但实际上每个区域都是同时的,只是表示方式可能会因地理条件的不同而有所不同。-这种理解正确吗 可能重复 假设我的时间在不同的时区,我想把它转换成不同的时区,用Java怎么做 创建一个格式化程序并在其中设置时区 在内部,Java中的时区,java,javascript,Java,Javascript,这可能是一个非常基本的问题,但我找不到任何满意的答案,希望我的疑问在这个问题上得到澄清 问题1假设我的时间在不同的时区,我想将它转换为不同的时区,那么用Java怎么做? 问题2有没有办法使用JavaScript获取时区? 问题3时区只是某个特定区域内时间的表示,但实际上每个区域都是同时的,只是表示方式可能会因地理条件的不同而有所不同。-这种理解正确吗 可能重复 假设我的时间在不同的时区,我想把它转换成不同的时区,用Java怎么做 创建一个格式化程序并在其中设置时区 在内部,java.util.D
java.util.Date
只存储UTC时区中自历元起的毫秒数。
当您使用不带时区的Date.toString()
或new SimpleDateFormat()
时,将使用VM的默认时区
因此,从某种意义上说,Java总是转换为当前/默认时区(除非您恰好在UTC)
有没有办法使用Java脚本获取时区
视情况而定。您可以使用getTimezoneOffset()
,但这只提供偏移量。没有获取客户端OSs时区ID的API(如UTC
,Europe/Berlin
等)
时区只是时间的表示
不是真的。见上文
假设我的时间在不同的时区,我想把它转换成不同的时区,用Java怎么做
创建一个格式化程序并在其中设置时区
在内部,java.util.Date
只存储UTC时区中自历元起的毫秒数。
当您使用不带时区的Date.toString()
或new SimpleDateFormat()
时,将使用VM的默认时区
因此,从某种意义上说,Java总是转换为当前/默认时区(除非您恰好在UTC)
有没有办法使用Java脚本获取时区
视情况而定。您可以使用getTimezoneOffset()
,但这只提供偏移量。没有获取客户端OSs时区ID的API(如UTC
,Europe/Berlin
等)
时区只是时间的表示
不是真的。参见上文。我可以回答您的第二个问题,并更正Aaron Digulla非常完整的回答 有没有办法使用Java脚本获取时区 尝试使用此库,它将返回具有特定限制的时区ID(在开发人员页面中指定):
我可以回答你的第二个问题并更正Aaron Digulla非常完整的回答 有没有办法使用Java脚本获取时区 尝试使用此库,它将返回具有特定限制的时区ID(在开发人员页面中指定): Q 1。假设我的时间在不同的时区,我想把它转换成不同的时区,用Java怎么做? 现代的方法是使用java.time类 首先,你的大部分工作都是在工作中完成的。仅在必要时应用时区,例如向用户演示 该类表示时间线上的一个时刻,分辨率为 如果只有UTC的偏移量,而没有时区,请应用
ZoneOffset
以获得OffsetDateTime
ZoneOffset offset = ZoneOffset.ofHours( -4 );
OffsetDateTime odt = instant.atOffset( offset );
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
ZoneId zParis = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtParis = zdt.withZoneSameInstant( zParis );
时区是UTC的偏移量(特定的小时、分钟和秒数)加上一组处理异常的规则,如夏令时(DST)。用ZoneId
对象表示时区。指定一个。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
应用ZoneId
以获取zoneDateTime
ZoneOffset offset = ZoneOffset.ofHours( -4 );
OffsetDateTime odt = instant.atOffset( offset );
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
ZoneId zParis = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtParis = zdt.withZoneSameInstant( zParis );
您可以将其他时区应用于Instant
或ZoneDateTime
ZoneOffset offset = ZoneOffset.ofHours( -4 );
OffsetDateTime odt = instant.atOffset( offset );
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
ZoneId zParis = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtParis = zdt.withZoneSameInstant( zParis );
问题2。有没有办法使用JavaScript获取时区?
从web浏览器确定时区的问题已经在堆栈溢出问题上处理了无数次
所以我将跳过这一步,只想说一句:不,不是以一种可靠的方式;当准确了解时区非常重要时,您必须询问用户本人
问题3。时区只是特定区域内时间的表示,但实际上每个区域都是在同一时间,只是表示方式可能因地理条件而异。-这种理解正确吗?
不,时区不是日期时间点
时区为日期时间添加有意义的上下文,就像货币名称为金额添加有意义的上下文一样。没有时区的日期时间只是可能时刻的粗略概念,而不是时间线上的精确点。奥克兰的中午早于加尔各答的中午,巴黎的中午早于魁北克山的中午
您可以将其视为伪数学语句:
时区=(与UTC的偏移量+异常规则集)
想象时区的示例:
- 偏移量可能是“UTC前一小时”,加上
- 这套规则:“在这一天,我们将使用DST,在这一天,我们将退出DST,在第二次世界大战期间的这一天,我们确实提前了一个小时,在第二次世界大战之后的这一天,我们向后移动了一个小时,在这一天,我们的政府将时钟向前移动了半个小时,以使我们与我们的主要竞争对手邻国不同,…”