java 简单日期格式?
java SimpleDateFormat?
public static void main(String[] args) {
Date now = new Date();
String dateString = now.toString();
System.out.println(" 1. " + dateString);
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
try {
Date parsed = format.parse(dateString);
System.out.println(" 2. " + parsed.toString());
} catch (ParseException pe) {
System.out.println("ERROR: Cannot parse \"" + dateString + "\"");
}
System.out.println(" 3. " + format.format(now));
}
在控制台打印:
1. Thu Feb 23 17:14:51 CET 2017
ERROR: Cannot parse "Thu Feb 23 17:14:51 CET 2017"
3. jeu. févr. 23 05:14:51 CET 2017
而不是:
1. Thu Feb 23 17:14:51 CET 2017
2. Thu Feb 23 17:14:51 CET 2017
3. jeu. févr. 23 05:14:51 CET 2017
看起来你的默认 Locale
是 FRENCH
,如果你不指定另一个 SimpleDateFormat
就使用它,你无法成功解析像 Thu
或 Feb
.
但是,您可以像这样指定 ENGLISH
Locale
的用法:
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
你已经运行进入了Javaclass现在已经过时的众多疾病之一Java。
可靠且简单的解决方法是更改为 Java 8 日期和时间 classes。最符合Date
的新class是Instant
。有了这个 class 你的代码就变成了:
Instant now = Instant.now();
String dateString = now.toString();
System.out.println(" 1. " + dateString);
try {
Instant parsed = Instant.parse(dateString);
System.out.println(" 2. " + parsed.toString());
} catch (DateTimeParseException e) {
System.out.println("ERROR: Cannot parse \"" + dateString + "\"");
}
我从你的示例中遗漏了 3.
。当然,可以用任何你能想到的方式格式化 Instant
,但如果我们只是想要与 toString
方法相同的输出,我现在觉得不值得。相反,我想表明,对于这种情况,您根本不需要格式。代码打印:
1. 2017-02-23T17:07:19.775Z
2. 2017-02-23T17:07:19.775Z
您注意到它以 UTC 格式打印时间。如果您想要本地时区,只需使用 ZonedDateTime
而不是 Instant
。其余代码完全相同,但现在我的计算机上输出为:
1. 2017-02-23T18:07:19.852+01:00[Europe/Berlin]
2. 2017-02-23T18:07:19.852+01:00[Europe/Berlin]
当然,在新的 classes 中也可能会产生一个错误,就像您从不同意的语言环境中得到的那样。据我所知,您必须明确指定不同意的语言环境。所以你不容易做到。
public static void main(String[] args) {
Date now = new Date();
String dateString = now.toString();
System.out.println(" 1. " + dateString);
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
try {
Date parsed = format.parse(dateString);
System.out.println(" 2. " + parsed.toString());
} catch (ParseException pe) {
System.out.println("ERROR: Cannot parse \"" + dateString + "\"");
}
System.out.println(" 3. " + format.format(now));
}
在控制台打印:
1. Thu Feb 23 17:14:51 CET 2017
ERROR: Cannot parse "Thu Feb 23 17:14:51 CET 2017"
3. jeu. févr. 23 05:14:51 CET 2017
而不是:
1. Thu Feb 23 17:14:51 CET 2017
2. Thu Feb 23 17:14:51 CET 2017
3. jeu. févr. 23 05:14:51 CET 2017
看起来你的默认 Locale
是 FRENCH
,如果你不指定另一个 SimpleDateFormat
就使用它,你无法成功解析像 Thu
或 Feb
.
但是,您可以像这样指定 ENGLISH
Locale
的用法:
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
你已经运行进入了Javaclass现在已经过时的众多疾病之一Java。
可靠且简单的解决方法是更改为 Java 8 日期和时间 classes。最符合Date
的新class是Instant
。有了这个 class 你的代码就变成了:
Instant now = Instant.now();
String dateString = now.toString();
System.out.println(" 1. " + dateString);
try {
Instant parsed = Instant.parse(dateString);
System.out.println(" 2. " + parsed.toString());
} catch (DateTimeParseException e) {
System.out.println("ERROR: Cannot parse \"" + dateString + "\"");
}
我从你的示例中遗漏了 3.
。当然,可以用任何你能想到的方式格式化 Instant
,但如果我们只是想要与 toString
方法相同的输出,我现在觉得不值得。相反,我想表明,对于这种情况,您根本不需要格式。代码打印:
1. 2017-02-23T17:07:19.775Z
2. 2017-02-23T17:07:19.775Z
您注意到它以 UTC 格式打印时间。如果您想要本地时区,只需使用 ZonedDateTime
而不是 Instant
。其余代码完全相同,但现在我的计算机上输出为:
1. 2017-02-23T18:07:19.852+01:00[Europe/Berlin]
2. 2017-02-23T18:07:19.852+01:00[Europe/Berlin]
当然,在新的 classes 中也可能会产生一个错误,就像您从不同意的语言环境中得到的那样。据我所知,您必须明确指定不同意的语言环境。所以你不容易做到。