我想用时区中间的字符
":"
打印日期,
例子:
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));
}
}
您需要使用
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
如果您使用 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 日期和时间
Calendar
和 SimpleDateFormat
。OffsetDateTime.now().truncatedTo( SECONDS ).toString()
2023-08-02T14:19:10+02:00
java.time.OffsetDateTime
您正在使用可怕的日期时间类,这些类在几年前已被 JSR 310 中定义的现代 java.time 类取代。
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