【问题标题】:Convert UTC Date to Local Date (server's timezone) in java jdk8在java jdk8中将UTC日期转换为本地日期(服务器的时区)
【发布时间】:2021-07-15 08:48:10
【问题描述】:

我想将 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;
        }
    }

【问题讨论】:

  • 你应该使用java.time而不是java.util.Date
  • 您可以使用ZonedDateTimeOffsetDateTime,它们都有now() 方法,查看一些java.time 文档。它会很好地为您服务...
  • 该代码看起来正确或接近。请问你的问题是什么?尽管我更愿意在 java.time 中进行 ZonedDateTime 对象之间的所有比较。此外,如果在早上运行并且最后一次是前一天晚上,那么不到一整天前,它似乎会像 TODAY,18:32 那样产生,即使那是昨天。我还会使用DateTimeFormatter 来格式化时间。
  • lastTime 我们得到的输入是 UTC,我们需要返回友好文本为“Month ago”、“Day ago”、“Week Ago”,如果是今天,我们需要返回“Today, "其次是小时和分钟。喜欢:今天,11:30。抱歉,不明白为什么我们需要使用 DateTimeFormatter。可以分享示例代码吗?
  • @pal.nag 我回答你的问题了吗?问是因为我不太清楚是哪个,但你遇到了麻烦。我的回答确实显示了 DateTimeFormatter 如何帮助生成像 23:00 这样的字符串,而无需我们“手动”连接字符串以处理前导零。

标签: java date datetime zoneddatetime localdatetime


【解决方案1】:

在 java.time 上全力以赴

两点:

  1. 全力以赴 java.time。当你收到一个老式的Date时,首先将其转换为Instant,然后使用java.time进行进一步的转换和处理,这样你就不需要处理Date。这可以为您节省大量转换,从而使您的代码更简单。
  2. 在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2018-09-21
    • 1970-01-01
    • 2020-03-25
    • 2015-06-30
    • 2012-10-07
    相关资源
    最近更新 更多