Java:将UTC中的日期转换为本地时区

Java:将UTC中的日期转换为本地时区,java,date,utc,Java,Date,Utc,我有UTC时区中存储在db中的日期。必须将此日期转换为系统本地时区。我在stackoverflow中研究了所有其他问题,但没有一个适合我。谁能帮我一下吗。 我只需要java.utils.Date中的输出,因为quartz scheduler的startAt()方法只接受日期。您可以使用以下代码 DateFormat localFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); localFormat.setTim

我有UTC时区中存储在db中的日期。必须将此日期转换为系统本地时区。我在stackoverflow中研究了所有其他问题,但没有一个适合我。谁能帮我一下吗。
我只需要java.utils.Date中的输出,因为quartz scheduler的startAt()方法只接受日期。

您可以使用以下代码

    DateFormat localFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    localFormat.setTimeZone(TimeZone.getTimeZone("PST"));


    Date locaTime = new Date(localFormat.format(date));

您可以使用以下代码

    DateFormat localFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    localFormat.setTimeZone(TimeZone.getTimeZone("PST"));


    Date locaTime = new Date(localFormat.format(date));
我使用的是Java8。我使用下面的代码从unix时间戳获取本地日期时间。可能还有其他方法可以从您想要的格式获取它

Date.from(LocalDateTime.ofEpochSecond(unixTimestamp, 0, ZoneOffset.UTC).toLocalDate());
我使用的是Java8。我使用下面的代码从unix时间戳获取本地日期时间。可能还有其他方法可以从您想要的格式获取它

Date.from(LocalDateTime.ofEpochSecond(unixTimestamp, 0, ZoneOffset.UTC).toLocalDate());
tl;博士 您不需要应用时区

细节
日期
已经有一个时区:UTC。它代表一个特定的时刻,时间线上的一个点。您只会将显示时区应用于用户首选的时区中的用户。在
欧洲/巴黎
亚洲/加尔各答
的上午7点和上午11点30分,设置为UTC上午6点的警报同时触发

日期
是UTC
java.util.Date
类已经使用了。不能将该对象调整到其他时区。该类只是一个包装器,从UTC 1970年的第一个时刻开始,以毫秒为单位。不要被其
toString
方法的混乱行为分散注意力,该方法在呈现字符串时应用JVM的当前默认时区;内部值以UTC†为单位

因此,您所要求的(从
日期开始,调整到本地时区,并呈现
日期)是不可能的,也没有意义

我建议您搜索和研究StackOverflow上的其他日期时间问题,以了解这些概念。专门搜索以下Java类:
Instant
ZoneId
ZonedDateTime

转化 当需要与尚未更新为java.time类型的旧代码交互时,可以转换为java.time。调用添加到旧类中的新转换方法

Instant instant = myJavaUtilDate.toInstant();  // UTC.
ZonedDateTime zdt = instant.atZone( ZoneId.of( "America/Montreal" ) );  // Same moment, but different wall-clock time.
您可以从java.time类转换

LocalDate ld = LocalDate.of( 2016 , 1 , 23 );  // 2016-01-23. No time zone at all.
LocalTime lt = LocalTime.of( 6 , 0 , 0 );  // 06:00:00. No time zone at all.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime( ld , lt , z );
Instant instant = zdt.toInstant();  // UTC.

// Convert from modern classes to legacy class.
java.util.Date d = java.util.Date.from( instant );

java.util.Date
实际上在其内部设置了时区。但是这个区域没有setter和getter方法。就我们这里的目的而言,我们可以忽略它。令人困惑对早期Java日期时间类中的许多糟糕的设计选择之一。这也是避免这些课程的众多原因之一。只使用java.time类。

tl;博士 您不需要应用时区

细节
日期
已经有一个时区:UTC。它代表一个特定的时刻,时间线上的一个点。您只会将显示时区应用于用户首选的时区中的用户。在
欧洲/巴黎
亚洲/加尔各答
的上午7点和上午11点30分,设置为UTC上午6点的警报同时触发

日期
是UTC
java.util.Date
类已经使用了。不能将该对象调整到其他时区。该类只是一个包装器,从UTC 1970年的第一个时刻开始,以毫秒为单位。不要被其
toString
方法的混乱行为分散注意力,该方法在呈现字符串时应用JVM的当前默认时区;内部值以UTC†为单位

因此,您所要求的(从
日期开始,调整到本地时区,并呈现
日期)是不可能的,也没有意义

我建议您搜索和研究StackOverflow上的其他日期时间问题,以了解这些概念。专门搜索以下Java类:
Instant
ZoneId
ZonedDateTime

转化 当需要与尚未更新为java.time类型的旧代码交互时,可以转换为java.time。调用添加到旧类中的新转换方法

Instant instant = myJavaUtilDate.toInstant();  // UTC.
ZonedDateTime zdt = instant.atZone( ZoneId.of( "America/Montreal" ) );  // Same moment, but different wall-clock time.
您可以从java.time类转换

LocalDate ld = LocalDate.of( 2016 , 1 , 23 );  // 2016-01-23. No time zone at all.
LocalTime lt = LocalTime.of( 6 , 0 , 0 );  // 06:00:00. No time zone at all.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime( ld , lt , z );
Instant instant = zdt.toInstant();  // UTC.

// Convert from modern classes to legacy class.
java.util.Date d = java.util.Date.from( instant );


java.util.Date
实际上在其内部设置了时区。但是这个区域没有setter和getter方法。就我们这里的目的而言,我们可以忽略它。令人困惑对早期Java日期时间类中的许多糟糕的设计选择之一。这也是避免这些课程的众多原因之一。只使用java.time类。

通过查看StackOverFlows问题,找到quartz类DateBuilder,它有助于转换时区

Date startDate = DateBuilder.translateTime(job.getStartDate(), TimeZone.getTimeZone("UTC"), TimeZone.getDefault());

通过查看StackOverFlows问题,找到一个quartz类DateBuilder,它有助于转换时区

Date startDate = DateBuilder.translateTime(job.getStartDate(), TimeZone.getTimeZone("UTC"), TimeZone.getDefault());

如果调度程序只接受
日期
,则没有时区需要关注-日期表示时间上的一个瞬间。我怀疑,如果您提供更多的上下文,我们将能够帮助您更多…@dhananjay您使用的是哪种java版本?实际上,日期是由ROR存储到db中的,它会在存储之前将日期转换为UTC格式。因此,当我从db中获取日期并创建date对象时,时间从我输入的值中得到更改,因为它的时区已更改。因此,我需要一种方法来获取UTC时区中存储在db中的日期,并将其转换为本地时区显示您用于从数据库获取日期的代码。是否在那里指定数据库中的日期为UTC?提醒队列.setStartDate(rs.getTimestamp(“rq.start_date”);其中rs是ResultSet。是的,日期存储在UTCIf中的db中。调度程序只接受
日期
,那么就没有需要关注的时区-日期表示时间上的一个瞬间。我怀疑,如果您提供更多的上下文,我们将能够帮助您更多…@dhananjay您使用的是哪种java版本?实际上,日期是由ROR存储到db中的,它会在存储之前将日期转换为UTC格式。因此,当我从db中获取日期并创建日期对象时,时间会从我所做的更改中得到更改