问题描述
'1337.docx'
解决方法
您的格式 YYYY-mm-dd'T'HH:MM:ss'Z'
不正确。让我们讨论一下这种格式的所有错误。
-
您使用了
Y
而不是y
: 符号Y
用于Week year
而y
用于Year
。查看 Difference between year-of-era and week-based-year? 以了解更多信息。 -
您已使用
mm
表示月份:月份的正确符号是M
。 -
您使用
MM
表示分钟:分钟的正确符号是m
。 -
您将
Z
括在单引号中: 符号Z
用于Time zone
而'Z'
只是一个字符文字.可能您想将+00:00
的时区偏移格式化为Z
,为此,您实际上应该使用X
。
所以,正确的格式如下:
yyyy-MM-dd'T'HH:mm:ssX
使用建议格式的演示:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX",Locale.ENGLISH);
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
System.out.println(sdf.format(date));
}
}
输出:
2021-01-14T08:13:01Z
请注意,java.util
的日期时间 API 及其格式 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API。
- 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7。
- 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
使用 Date#toInstant
将 java.util.Date
对象(遗留类型)转换为 java.time.Instant
(现代类型)。 Instant
代表时间线上的一个瞬时点,应该足以满足您的大多数 JSON 操作。 Instant#toString
返回具有符合 ISO-8601 standards 的 UTC 时区偏移量的日期时间字符串。
演示:
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
Instant instant = date.toInstant();
// Print the value of instant#toString
System.out.println(instant);
OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC);
System.out.println(odt);
// Custom format
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX",Locale.ENGLISH);
System.out.println(dtf.format(odt));
}
}
输出:
2021-01-14T08:28:35.659Z
2021-01-14T08:28:35.659Z
2021-01-14T08:28:35Z