SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");自定义时区

问题描述 投票:0回答:3

我想用时区中间的字符

":"
打印日期, 例子:

2023-08-02T14:19:10+02:00

目前我正在使用这种模式:

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

它打印:

2023-08-02T14:19:10+0200

有什么想法吗?

下面是代码示例:

public class testDate {

    public static final DateFormat PATTERN = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

    public static String calendarToString(final Calendar dateToConvert, final DateFormat df) {
        return df.format(dateToConvert.getTime());
    }

    public static void main(String[] args) {
        Calendar effectiveDate = Calendar.getInstance();
        System.out.println(calendarToString(effectiveDate, PATTERN));
    }
}
java date simpledateformat formatter
3个回答
4
投票

您需要使用

XXX
而不是
Z
来获取格式为
{Z|{+|-}HH:mm}
的时区。也就是说,您确实应该改用新的
java.time
类型,并停止使用
SimpleDateFormat

这显示在

SimpleDateFormat
文档中的示例之一

日期和时间模式 结果
... ...
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
2001-07-04T12:08:56.235-07:00

1
投票

如果您使用 Java 1.8+,则应该使用

java.time
包中的类。

您用于

java.text.SimpleDateFormat
类的格式也应该适用于
java.time.format.DateTimeFormatter
类。

这是一个例子:

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

public class ZonedDateTimeFormatExample {
  public static void main(String... args) {
    ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Africa/Cairo"));
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
    System.out.printf("Current date and time in Cairo, Egypt: %s%n", fmt.format(now));
  }
}

避免使用

java.text
java.util
包进行日期/时间/日历解析和格式化。

这包括但不限于:

  • java.util.Calendar
  • java.util.Date
  • java.text.SimpleDateFormat

请查看:Java SE 8 日期和时间


0
投票

tl;博士

  • 你太辛苦了。
  • 使用现代的java.time。切勿使用
    Calendar
    SimpleDateFormat
  • 标准格式无需指定格式模式。
  • 截断不需要的小数秒。
OffsetDateTime.now().truncatedTo( SECONDS ).toString()

2023-08-02T14:19:10+02:00

java.time.OffsetDateTime

您正在使用可怕的日期时间类,这些类在几年前已被 JSR 310 中定义的现代 java.time 类取代。

对于在 UTC 偏移量的情况下包含时间的日期,请使用类

OffsetDateTime

首先指定您想要的偏移量

ZoneOffset offset = ZoneOffset.ofHours( 2 ) ;  // +02:00

捕获当前时刻,如该偏移中所示。

OffsetDateTime odt = OffsetDateTime.now( offset ) ;

由于您对秒的小数部分不感兴趣,因此截断

OffsetDateTime odt = odt.truncatedTo( ChronoUnit.SECONDS ) ;

以您所需的格式生成文本,该格式恰好符合生成/解析文本时在 java.time 中默认使用的 ISO 8601 标准格式。因此无需指定格式模式。

String output = odt.toString() ;

2023-08-02T14:19:10+02:00

© www.soinside.com 2019 - 2024. All rights reserved.