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

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

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

  1. import java.time.*;
  2. import java.util.Date;
  3. private String getDateInString(Date lastTime) {
  4. Date in = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());
  5. LocalDateTime monthLdt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault()).minusMonths(1);
  6. Date monthAgo = Date.from(monthLdt.atZone(ZoneId.systemDefault()).toInstant());
  7. LocalDateTime weekLdt = LocalDateTime.now().minusWeeks(1);
  8. Date weekAgo = Date.from(weekLdt.atZone(ZoneId.systemDefault()).toInstant());
  9. LocalDateTime dayLdt = LocalDateTime.now().minusDays(1);
  10. Date dayAgo = Date.from(dayLdt.atZone(ZoneId.systemDefault()).toInstant());
  11. if (lastTime.before(monthAgo)) {
  12. return "Month ago";
  13. } else if (lastTime.before(weekAgo)) {
  14. return "Week Ago";
  15. } else if (lastTime.before(dayAgo)) {
  16. return "Day Ago";
  17. } else {
  18. LocalDateTime lastLdt = LocalDateTime.ofInstant(lastTime.toInstant(), ZoneId.systemDefault());
  19. String min = lastLdt.getMinute() + "";
  20. if (lastLdt.getMinute() < 10) {
  21. min = "0" + min;
  22. }
  23. return "TODAY," + lastLdt.getHour() + ":" + min;
  24. }
  25. }
uemypmqf

uemypmqf1#

全力以赴java.time

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

  1. private static final DateTimeFormatter TIME_FORMATTER
  2. = DateTimeFormatter.ofPattern("H:mm");
  3. private static String getDateInString(Date lastTime) {
  4. ZoneId localZone = ZoneId.systemDefault();
  5. ZonedDateTime lastDateTime = lastTime.toInstant().atZone(localZone);
  6. ZonedDateTime now = ZonedDateTime.now(localZone);
  7. ZonedDateTime monthZdt = now.minusMonths(1);
  8. ZonedDateTime weekZdt = now.minusWeeks(1);
  9. ZonedDateTime dayZdt = now.minusDays(1);
  10. if (lastDateTime.isBefore(monthZdt)) {
  11. return "Month ago";
  12. } else if (lastDateTime.isBefore(weekZdt)) {
  13. return "Week Ago";
  14. } else if (lastDateTime.isBefore(dayZdt)) {
  15. return "Day Ago";
  16. } else {
  17. String dayText;
  18. if (lastDateTime.toLocalDate().isBefore(now.toLocalDate())) {
  19. dayText = "YESTERDAY";
  20. } else {
  21. dayText = "TODAY";
  22. }
  23. String timeText = lastDateTime.format(TIME_FORMATTER);
  24. return String.format("%s, %s", dayText, timeText);
  25. }
  26. }

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

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

输出为:

  1. YESTERDAY, 23:00
  2. TODAY, 5:00
展开查看全部

相关问题