在以时区为输入的java中,如何在没有服务器时间的情况下获取正确的日期和时间

在以时区为输入的java中,如何在没有服务器时间的情况下获取正确的日期和时间,java,timezone,Java,Timezone,我的应用程序托管在伦敦的服务器上。我在美国的米纳索塔,所以时区是不同的 如何使用时区获取当前日期/时间。棘手的是,我不想根据服务器日期和时间获取当前日期和时间。是否有一种方法可以根据时区获取真实的当前日期和时间 下面的代码返回信息,但如果服务器日期无效,则响应也将是无效日期。但我想要真实的日期和时间。 我的输入将是时区。感谢您的帮助 Date date = new Date(); DateFormat df = new SimpleDateFormat("yyyy-MM-dd H

我的应用程序托管在伦敦的服务器上。我在美国的米纳索塔,所以时区是不同的

如何使用时区获取当前日期/时间。棘手的是,我不想根据服务器日期和时间获取当前日期和时间。是否有一种方法可以根据时区获取真实的当前日期和时间

下面的代码返回信息,但如果服务器日期无效,则响应也将是无效日期。但我想要真实的日期和时间。 我的输入将是时区。感谢您的帮助

    Date date = new Date();
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

 // Use Minasota's time zone to format the date in
    df.setTimeZone(TimeZone.getTimeZone("America/Minasota"));
    System.out.println("Date and time in Minasota: " + df.format(date));

必须知道,在Java8中不推荐使用三个字母的时区缩写。所以,不要期望他们永远得到支持。以下是使用java 8时间api实现此目的的两个等效示例:

System.out.println(Instant.now().atZone(ZoneId.of("CST",ZoneId.SHORT_IDS)));
System.out.println(Instant.now().atZone(ZoneId.of("America/Chicago")));

这个问题可能与

重复。重要的是要知道,在Java8中不推荐使用三个字母的时区缩写。所以,不要期望他们永远得到支持。以下是使用java 8时间api实现此目的的两个等效示例:

System.out.println(Instant.now().atZone(ZoneId.of("CST",ZoneId.SHORT_IDS)));
System.out.println(Instant.now().atZone(ZoneId.of("America/Chicago")));
这个问题可能是tl的重复;博士 是否有一种方法可以根据时区获取真实的当前日期和时间

对。使用现代java.time而不是糟糕的遗留类

ZonedDateTime.now(                    // Represent a moment as seen through the wall-clock time used by the people of a particular region (a time zone). 
    ZoneId.of( "America/Chicago" )    // Specify time zone by proper `Continent/Region` name, *never* 2-4 letter pseudo-zones such as “CST”. 
)                                     // Returns a `ZonedDateTime` object.
.toString()                           // Generate text in standard ISO 8601 format wisely extended to append the name of the time zone in square brackets. 
2018-11-07T14:38:24.723394-06:00[美国/芝加哥]

细节 我的应用程序托管在伦敦的服务器上。我在美国米纳索塔

这应该与你的应用无关

  • 服务器应默认为UTC时区(通常)
  • 应要求客户确认其所需/预期时区(关键时)
  • 始终通过传递可选参数来显式指定所需/预期时区,而不是隐式依赖JVM的当前默认时间,该时间在运行时的任何时刻都可能更改(!)
如何使用时区获取当前日期/时间

首先,大多数业务逻辑、存储和日期时间值的交换都应该在UTC中完成

Instant instant = Instant.now() ;  // Current moment in UTC.
你可以通过一个墙上的时钟的镜头看到同一时刻,一个特定地区,一个时区的人们使用的时间

这是美国/芝加哥

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用2-4个字母的缩写,例如
CST
EST
IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)

作为快捷方式,您可以跳过
即时

ZonedDateTime zdt = ZonedDateTime.now( z ) ;
但是我想要真实的日期和时间

➥ 以下是掌握日期和时间工作的核心概念:上面看到的
即时时间
(UTC)和
分区日期时间
(某些时区)代表了非常相同的时刻。这两个对象表示时间线上的同一点。它们都是“真实的日期和时间”。他们使用两个不同的挂钟时间来显示同一时刻

如果一个冰岛人和明尼阿波利斯的人通电话,他们都在墙上查各自的时钟和日历,大声说出当前的日期和时间,哪一个是正确的?两者都是正确的,用两种方式来表达相同的同时时刻

事实上,您最好将UTC视为唯一的真实时间™, 所有分区时间都只是变化。专注于你自己的狭隘时区,然后来回翻译,会让你发疯。关注UTC,仅当用户预期或业务逻辑需要时才调整到时区

这在堆栈溢出上已经被多次讨论过了。因此,请搜索更多信息和示例。并学会在发布前搜索堆栈溢出

要生成字符串,请为标准ISO 8601格式的文本调用
toString
,或使用
DateTimeFormatter.ofLocalized…
自动本地化,或使用
DateTimeFormatter.ofPattern
指定自定义格式模式。这已经在堆栈溢出上被多次讨论过了,所以请搜索更多信息


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(tl;dr 是否有一种方法可以根据时区获取真实的当前日期和时间

      是的。使用现代java.time而不是糟糕的遗留类

      ZonedDateTime.now(                    // Represent a moment as seen through the wall-clock time used by the people of a particular region (a time zone). 
          ZoneId.of( "America/Chicago" )    // Specify time zone by proper `Continent/Region` name, *never* 2-4 letter pseudo-zones such as “CST”. 
      )                                     // Returns a `ZonedDateTime` object.
      .toString()                           // Generate text in standard ISO 8601 format wisely extended to append the name of the time zone in square brackets. 
      
      2018-11-07T14:38:24.723394-06:00[美国/芝加哥]

      细节 我的应用程序托管在伦敦的服务器上。我在美国米纳索塔

      这应该与你的应用无关

      • 服务器应默认为UTC时区(通常)
      • 应要求客户确认其所需/预期时区(关键时)
      • 始终通过传递可选参数来显式指定所需/预期时区,而不是隐式依赖JVM的当前默认时间,该时间在运行时的任何时刻都可能更改(!)
      如何使用时区获取当前日期/时间

      首先,您的大部分业务逻辑、存储和exc