Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java即时更新-具有不同的时区_Java_Date - Fatal编程技术网

Java即时更新-具有不同的时区

Java即时更新-具有不同的时区,java,date,Java,Date,我正在EST时区运行我的代码 在我的代码中使用Instant.now(),它以UTC返回时间 但是,我正在尝试测试一种方法,该方法将从数据库中获取数据作为Date而不是Instant,因此尝试使用 Date.from(Instant.now()) 因为,我在EST中运行这个,这个日期给了我在EST中的时间 实际代码 final Optional<Date> dbTime = dbService.getUpdatedTime(); final Instant last

我正在EST时区运行我的代码

在我的代码中使用
Instant.now()
,它以UTC返回时间

但是,我正在尝试测试一种方法,该方法将从数据库中获取数据作为Date而不是Instant,因此尝试使用

Date.from(Instant.now())
因为,我在EST中运行这个,这个
日期给了我在EST中的时间

实际代码

    final Optional<Date> dbTime = dbService.getUpdatedTime();
    final Instant lastInstant = dbTime.orElseGet(() -> Date.from(Instant.now())).toInstant();
这里,
dbTime
被转换为EST时间。我可以通过设置
TimeZone.setDefault(TimeZone.getTimeZone(“UTC”))返回UTC时间


还有其他更好的办法吗?设置
TimeZone.setDefault(TimeZone.getTimeZone(“UTC”)可以吗,以便始终将其视为UTC?

第一个建议,因为您可以使用现代Java日期和时间API,所以尽可能多地使用它,并尽量减少过时的
日期
类的使用。如果您可以修改
getUpdateTime()
以返回
可选的
,而不是
可选的
(现代JDBC驱动程序可以直接将数据库中的日期时间作为
即时的
)。由于
即时
以UTC打印,因此这应该会消除您的所有问题和疑问

在这个回答中,我假设你要么不能这样做,要么现在还不想这样做。不过,您仍然可以靠近:

    final Optional<Instant> dbTime = dbService.getUpdatedTime().map(Date::toInstant);
    final Instant lastReconInstant = dbTime.orElseGet(Instant::now);

所有这些都表明,在我看来,你一开始似乎没有问题。
日期
中没有时区。它的
toString
方法只是获取JVM的默认时区,并使用它来呈现日期和时间。这愚弄了很多人,这只是尽可能避免使用该类的原因之一。

第一个建议,因为您可以使用现代Java日期和时间API,尽可能多地使用它,并尽量减少过时的
日期
类的使用。如果您可以修改
getUpdateTime()
以返回
可选的
,而不是
可选的
(现代JDBC驱动程序可以直接将数据库中的日期时间作为
即时的
)。由于
即时
以UTC打印,因此这应该会消除您的所有问题和疑问

在这个回答中,我假设你要么不能这样做,要么现在还不想这样做。不过,您仍然可以靠近:

    final Optional<Instant> dbTime = dbService.getUpdatedTime().map(Date::toInstant);
    final Instant lastReconInstant = dbTime.orElseGet(Instant::now);

所有这些都表明,在我看来,你一开始似乎没有问题。
日期
中没有时区。它的
toString
方法只是获取JVM的默认时区,并使用它来呈现日期和时间。这愚弄了很多人,只是尽可能避免使用该类的原因之一。

日期的可能重复项
没有时区。这只是时间的瞬间。看@JonSkeet是对的。所以你基本上没有问题。只是
Date.toString()
让你相信你有一个。澄清一下:遗留类
java.util.Date
和现代类
java.time.Instant
都代表了UTC的一个时刻<代码>即时
已替换
日期
。不需要混合上课。从JDBC 4.2及更高版本开始,切勿使用
日期
,始终使用
即时
。日期
的可能副本没有时区。这只是时间的瞬间。看@JonSkeet是对的。所以你基本上没有问题。只是
Date.toString()
让你相信你有一个。澄清一下:遗留类
java.util.Date
和现代类
java.time.Instant
都代表了UTC的一个时刻<代码>即时
已替换
日期
。不需要混合上课。从JDBC 4.2及更高版本开始,永远不要使用
Date
,而是始终使用
Instant
    final Date dbTime = Date.from(Instant.now().minus(10, ChronoUnit.HOURS));

    final Date dbTime = Date.from(Instant.now().minus(Duration.ofHours(10)));