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

时间:2016-12-07 11:24:04

标签: java date utc

我的日期以UTC时区存储在db中。必须将此日期转换为系统本地时区。我在stackoverflow中查看了所有其他问题但是没有它们适合我。请任何人帮我这个。 我只需要java.utils.Date中的输出,因为quartz scheduler的startAt()方法只接受Date。

4 个答案:

答案 0 :(得分:2)

TL;博士

需要申请时区。

详细

Date已有时区:UTC。它代表一个特定时刻,即时间轴上的一个点。您只能在用户首选的wall-clock time中将时区应用于用户。上午6点的闹钟设置在Europe/Paris上午7点和Asia/Kolkata上午11:30点火 - 同时发生的同一时刻。

Date是UTC

java.util.Date课程已使用UTC。您无法将该对象调整为其他时区。该类只是自UTC 1970年第一个时刻以来毫秒数的包装器。不要被其toString方法的混乱行为分散注意力,该方法在呈现String时应用JVM的当前默认时区;内部值以UTC

所以你问的问题(从Date开始,调整到当地时区,并渲染Date)是不可能的,没有任何意义。

我建议你在StackOverflow上搜索和研究其他日期时间问题来学习这些概念。专门搜索这些Java类:InstantZoneIdZonedDateTime

转换

当需要与尚未更新为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类。

答案 1 :(得分:0)

您可以使用以下代码

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


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

答案 2 :(得分:0)

我正在使用java 8中的LocalDateTime。我使用下面的代码从unix时间戳获取本地日期时间。可能还有其他方法可以从您想要的格式中获取它。

$scope.users = [
  {
  "id": "1",
  "name": "John",
  "city": "NY"
  },
 {
  "id": "2",
  "name": "Gerold",
  "city": "LA"
 },
 {
   "id": "3",
  "name": "Stuart",
  "city": "Boston"
 }  
];

$scope.cities = $scope.users.map(function(obj){ 

 return obj.city;
});

console.log($scope.cities);

答案 3 :(得分:0)

通过查看StackOverFlows问题,找到一个类型的石英DateBuilder,它有助于翻译时区

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