如何在日历中使用 SimpleDateFormat?

我已经有了 GregorianCalendar 实例,需要使用 SimpleDateFormat (或者可以与日历一起使用,但是提供了所需的 # frmat ()特性)来获得所需的输出。请提出解决方案,就像永久解决方案一样好。

94819 次浏览

GetTime ()返回一个可以与 SimpleDateFormat 一起使用的 Date。

只需调用 calendar.getTime()并将结果 Date对象传递给 format方法。

试试这个:

Calendar cal = new GregorianCalendar();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
dateFormat.setTimeZone(cal.getTimeZone());
System.out.println(dateFormat.format(cal.getTime()));

EQui 的回答漏了一步

Calendar cal = new GregorianCalendar();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
#---- This uses the provided calendar for the output -----
dateFormat.setCalendar(cal);
System.out.println(dateFormat.format(cal.getTime()));

爪哇时间

我建议您使用 Java.time,这是现代的 Java 日期和时间 API,用于您的日期和时间工作。所以不是 GregorianCalendar。由于 GregorianCalendar持有所有的日期,一天的时间和时区,一般的现代替代品是 ZonedDateTime

你没有说明 需要输出是什么。我假设我们希望输出一个人类用户。因此,使用 Java 内置的本地化格式来设置用户的语言环境:

private static final DateTimeFormatter FORMATTER
= DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(Locale.forLanguageTag("es"));

我特别指出西班牙语只是一个例子。如果希望使用 JVM 的默认语言环境,可以指定 Locale.getDefault(Locale.Category.FORMAT),或者完全省略对 withLocale()的调用。现在,格式化 ZonedDateTime非常简单(比使用 GregorianCalendar更简单) :

    ZonedDateTime zdt = ZonedDateTime.of(
2011, 4, 11, 19, 11, 15, 0, ZoneId.of("Australia/Perth"));
System.out.println(zdt.format(FORMATTER));

这个例子的输出:

2011年4月11日,东部夏令时19:11:15

如果您只需要日期,而不需要日期或时区,那么您需要两个更改:

  1. 使用 LocalDate代替 ZonedDateTime
  2. 使用 DateTimeFormatter.ofLocalizedDate()代替 .ofLocalizedDateTime()

如果我真的得了 GregorianCalendar呢?

如果您从一个还没有升级到 java.time 的旧 API 获得了一个 GregorianCalendar,那么转换为 ZonedDateTime:

    GregorianCalendar cal = new GregorianCalendar(
TimeZone.getTimeZone(ZoneId.of("Australia/Perth")));
cal.set(2011, Calendar.APRIL, 11, 19, 11, 15);
ZonedDateTime zdt = cal.toZonedDateTime();

然后像以前一样继续。输出将是相同的。

林克

Oracle 教程: Date Time 解释如何使用 java.Time。