在JavaJDK8中将utc日期转换为本地日期(服务器的时区)

efzxgjgh  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(403)

我想从utc java.util.date time(以utc为单位)转换为服务器的本地时间。我们正在使用jdk8。我该怎么做?
我的要求是,我们得到的是utc的最后一次。我们需要在门户中以本地时区显示用户友好的日期。下面是我的代码,这是不工作。

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;
        }
    }
uemypmqf

uemypmqf1#

全力以赴java.time

两点:
在java.time上全力以赴。当你收到一个老式的 Date ,将其转换为 Instant 首先,使用java.time进行进一步的转换和处理,这样就不需要处理 Date . 这可以节省大量转换,从而使代码更简单。
java.time中要使用的类是 ZonedDateTime . 自 Date 是一个时间点,为了进行有意义的比较,您在java.time中也需要一个定义时间点的类。 LocalDateTime 没有。一 ZonedDateTime 是时区中的日期和时间,所以我们需要的是本地时间(不管类名是什么) LocalDateTime ).
另外,如果问题中的代码是在早上运行的,而最后一次是在前一天晚上,所以不到一整天之前,它看起来会像 TODAY,18:32 即使那是昨天。我也会使用 DateTimeFormatter 用于格式化时间。

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

相关问题