【问题标题】:Simplest way to convert Java Calendar to ISO将 Java 日历转换为 ISO 的最简单方法
【发布时间】:2018-11-05 14:11:04
【问题描述】:

我有一个以下列格式返回的日历(它是 Java 日历类型):2020-02-15T00:00:00。 将其转换为像这样的以下日历并保持日历类型的最简单、最短的方法是什么:Mon Nov 05 2018 14:08:58 GMT+0000 (Greenwich Mean Time)

在 JavaScript 中,我们可以使用 var date = new Date(); 之类的东西

【问题讨论】:

  • 到目前为止你有没有尝试过?
  • 您应该使用来自java.time 包的新Java Time API。 CalendarDateSimpleDateFormat 类已过时。
  • 我推荐你使用在java 8中生成的新API它是LocalDate它比日历容易得多
  • 我无法理解这个问题,抱歉。 2020-02-15T00:00:00 是 ISO 8601 格式。 Mon Nov 05 2018 14:08:58 GMT+0000 (Greenwich Mean Time) 不是。另外Calendar 没有格式,所以不能以你说的格式返回。
  • Calendar 类早已过时且设计不佳。你为什么要坚持这一点?我会坚持一个Instant(来自java.time 的类,现代Java 日期和时间API),或者如果这不可行,那么它的字符串表示(来自它的toString 方法;它遵守ISO 8601)。你的问题听起来很像XY problem,所以请提供更多背景信息,说明你认为你想要这个的原因。

标签: java date java-calendar


【解决方案1】:

日期时间对象没有“格式”

我有一个以以下格式返回的日历(它是 Java 日历类型):2020-02-15T00:00:00。

不,你没有。

Calendar 对象没有格式。只有表示日期时间值的文本才有格式。

遵循这样的日历并坚持日历类型:2018 年 11 月 5 日星期一 14:08:58 GMT+0000(格林威治标准时间)?

不存在具有该格式的Calendar 对象,因为Calendar 没有格式并且不是文本。

在发布之前学习搜索 Stack Overflow。这已经讲过很多次了。

java.time

可怕的Calendar 类在几年前被java.time 类所取代,并采用了JAR 310。永远不要使用Calendar

使用OffsetDateTime 类获取UTC 的当前时间。

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;

要生成标准 ISO 8601 格式的文本,请致电 toString。要将日期时间值保存为文本,请使用这些格式——这就是它们被发明的原因。

要生成其他格式的文本,请使用DateTimeFormatter 类。这已经讲过很多次了,所以搜索 Stack Overflow。

转换

如果给定 GregorianCalendar 对象,则通过调用添加到旧遗留类的新方法立即转换为 ZonedDateTime 对象。

ZonedDateTime zdt = myGregCal.toZonedDateTime() ; 

如果需要,请投射。

ZonedDateTime zdt = ( (GregorianCalendar) myCal ).toZonedDateTime() ; 

然后使用DateTimeFormatter 生成所需格式的文本。

【讨论】:

  • 好吧,考虑到我一直这样做的一个事实,我一定很难找到那些涉及很多次的主题。至少有助于指出正确的方向。
  • @LazioTibijczyk duckduckgo.com/…。前两个点击解决了您的主题并解释了现代 java.time 类。
【解决方案2】:

这是一个使用 Java 8 中引入的 Date API 将字符串转换为示例格式的示例:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

class Scratch {
    public static void main(String[] args) {

        String input = "2020-02-15T00:00:00";

        LocalDateTime parsedTime = LocalDateTime.parse(input);

        ZonedDateTime zonedDateTime = ZonedDateTime.of(parsedTime, ZoneId.of("GMT"));

        String output = DateTimeFormatter.ofPattern("EEE MMM dd yyyy HH:mm:ss Z '('z')'")
                .format(zonedDateTime);

        System.out.print(output);
    }
}

【讨论】:

  • 这不是日历,而是字符串。
  • @LazioTibijczyk 更新为使用字符串而不是日历类。
【解决方案3】:

您可以使用SimpleDateFormat

import java.text.DateFormat;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;

public class HelloWorld
{
  public static void main(String[] args)
  {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    String dateString = "2020-02-15T00:00:00";
    try {
        Date parsed = format.parse(dateString);
        System.out.print(parsed.toString());
        }
        catch(ParseException pe) {
            System.out.println("ERROR: Cannot parse \"" + dateString + "\"");
    }
  }
}

【讨论】:

  • 无法解析日历。这不是字符串。
  • 但不知何故你可以看到这个值...toString() 方法呢?
  • 请不要教年轻人使用早已过时且臭名昭著的麻烦SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中做得更好。
【解决方案4】:

假设你有一个 Calendar cal 的实例,你应该可以这样做:

SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss Z");
String result = dateFormat.format(cal.getTime());

getTime 为您提供 SimpleDateFormat 的日期。

这是处理日历对象的最简单方法。也是最容易出错的一种。我确实同意所有 cmets 说你应该使用 java.time,但我是谁告诉你该怎么做。

【讨论】:

  • 请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中做得更好。
  • 我也更喜欢新的 java.time api,但如果他得到一个过时的 Calendar 对象,他还不如使用旧库来简洁或?特别是如果他要求最简单的方法。
猜你喜欢
  • 2014-10-27
  • 2012-08-01
  • 2010-11-28
  • 2019-08-14
  • 1970-01-01
  • 2012-09-02
  • 2011-10-08
  • 1970-01-01
相关资源
最近更新 更多