0

我想将 utc java.util.date 时间(UTC)转换为服务器的本地时间。我们使用 jdk8。我怎样才能做到这一点?

我的要求是,我们在 UTC 中获得 lastTime。我们需要在门户中以本地时区显示用户友好的日期。下面是我的代码,它不起作用。

import java.time.*;
import java.util.Date;
private String getDateInString(Date lastTime) {
        Date in = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());
        LocalDateTime monthLdt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault()).minusMonths(1);
        Date monthAgo = Date.from(monthLdt.atZone(ZoneId.systemDefault()).toInstant());
        LocalDateTime weekLdt = LocalDateTime.now().minusWeeks(1);
        Date weekAgo = Date.from(weekLdt.atZone(ZoneId.systemDefault()).toInstant());
        LocalDateTime dayLdt = LocalDateTime.now().minusDays(1);
        Date dayAgo = Date.from(dayLdt.atZone(ZoneId.systemDefault()).toInstant());

        if (lastTime.before(monthAgo)) {
            return "Month ago";
        } else if (lastTime.before(weekAgo)) {
            return "Week Ago";
        } else if (lastTime.before(dayAgo)) {
            return "Day Ago";
        } else {
            LocalDateTime lastLdt = LocalDateTime.ofInstant(lastTime.toInstant(), ZoneId.systemDefault());
            String min = lastLdt.getMinute() + "";
            if (lastLdt.getMinute() < 10) {
                min = "0" + min;
            }
            return "TODAY," + lastLdt.getHour() + ":" + min;
        }
    }
4

1 回答 1

2

全力以赴 java.time

两点:

  1. 全力以赴 java.time。当您收到老式Date的. 这可以为您节省大量转换,从而使您的代码更简单。InstantDate
  2. 在 java.time 中使用的类是ZonedDateTime. 因为Date是一个时间点,为了进行有意义的比较,您在 java.time 中也需要一个定义时间点的类。LocalDateTime才不是。AZonedDateTime是时区中的日期和时间,所以我们需要本地时间(尽管类名LocalDateTime)。

此外,如果您的问题代码在早上运行,最后一次是前一天晚上,所以不到一整天前,它似乎会像TODAY,18:32昨天一样产生。我也会使用 aDateTimeFormatter来格式化时间。

private static final DateTimeFormatter TIME_FORMATTER
        = DateTimeFormatter.ofPattern("H:mm");

private static String getDateInString(Date lastTime) {
    ZoneId localZone = ZoneId.systemDefault();
    
    ZonedDateTime lastDateTime = lastTime.toInstant().atZone(localZone);
    ZonedDateTime now = ZonedDateTime.now(localZone);
    
    ZonedDateTime monthZdt = now.minusMonths(1);
    ZonedDateTime weekZdt = now.minusWeeks(1);
    ZonedDateTime dayZdt = now.minusDays(1);

    if (lastDateTime.isBefore(monthZdt)) {
        return "Month ago";
    } else if (lastDateTime.isBefore(weekZdt)) {
        return "Week Ago";
    } else if (lastDateTime.isBefore(dayZdt)) {
        return "Day Ago";
    } else {
        String dayText;
        if (lastDateTime.toLocalDate().isBefore(now.toLocalDate())) {
            dayText = "YESTERDAY";
        } else {
            dayText = "TODAY";
        }
        String timeText = lastDateTime.format(TIME_FORMATTER);
        return String.format("%s, %s", dayText, timeText);
    }
}

要试用以下两个日期,分别是我所在时区的昨天晚上和今天早上:

    System.out.println(getDateInString(Date.from(Instant.parse("2021-04-21T21:00:00Z"))));
    System.out.println(getDateInString(Date.from(Instant.parse("2021-04-22T03:00:00Z"))));

输出是:

YESTERDAY, 23:00
TODAY, 5:00
于 2021-04-22T06:09:30.867 回答