Java中的时区

Java中的时区,java,javascript,Java,Javascript,这可能是一个非常基本的问题,但我找不到任何满意的答案,希望我的疑问在这个问题上得到澄清 问题1假设我的时间在不同的时区,我想将它转换为不同的时区,那么用Java怎么做? 问题2有没有办法使用JavaScript获取时区? 问题3时区只是某个特定区域内时间的表示,但实际上每个区域都是同时的,只是表示方式可能会因地理条件的不同而有所不同。-这种理解正确吗 可能重复 假设我的时间在不同的时区,我想把它转换成不同的时区,用Java怎么做 创建一个格式化程序并在其中设置时区 在内部,java.util.D

这可能是一个非常基本的问题,但我找不到任何满意的答案,希望我的疑问在这个问题上得到澄清

问题1假设我的时间在不同的时区,我想将它转换为不同的时区,那么用Java怎么做?

问题2有没有办法使用JavaScript获取时区?

问题3时区只是某个特定区域内时间的表示,但实际上每个区域都是同时的,只是表示方式可能会因地理条件的不同而有所不同。-这种理解正确吗

可能重复

假设我的时间在不同的时区,我想把它转换成不同的时区,用Java怎么做

创建一个格式化程序并在其中设置时区

在内部,
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,在第二次世界大战期间的这一天,我们确实提前了一个小时,在第二次世界大战之后的这一天,我们向后移动了一个小时,在这一天,我们的政府将时钟向前移动了半个小时,以使我们与我们的主要竞争对手邻国不同,…”
您可以将时区应用于时间线上的某个点。就像通过镜头看艺术一样,它改变了你的感知,而不是人工制品本身。通过l查看时间线上的一个点