将字符串转换为日期 - Java
Converting String to Date - Java
我已经实现了以下方法将 String
转换为 Date
因为 Date(String)
构造函数已被弃用:
private Date format(String inputString) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
try {
return dateFormat.parse(inputString);
} catch (ParseException e) {
return new Date();
}
}
一个 inputString
个样本是 2017-06-01T01:00:00Z
。但是,当我检查输出时,我发现异常处理程序被触发并返回 new Date()
,这意味着我的模式有问题:"Jun 17, 2017 1:12:02 PM"
.
模式 yyyy-MM-dd'T'HH:mm:ssZ
我错过了什么?
您的输入字符串中有文字 Z
,因此您也需要引用它(或使用 X
)。喜欢,
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
或更好(如评论中指出)
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
此外,不要丢弃异常(至少打印堆栈跟踪)。在 Java 8+ 中,您应该使用新的 java.time
类。这可能看起来像,
private static LocalDateTime format(String inputString) {
String pattern = "yyyy-MM-dd'T'HH:mm:ssX";
return LocalDateTime.from(DateTimeFormatter.ofPattern(pattern)
.parse(inputString));
}
Z
模式表示数字时区偏移量。因此,此处所需的偏移量为 +0000
.
X
模式允许您使用时区偏移量,例如 Z
。 (是的,这似乎违反直觉,但就是这样。)
我同意 Joe C 和 Louis Wassermann 的评论:如果有任何办法,请远离早已过时的 Date
class。还有。现代替代品 classes 非常方便,对程序员也很友好。
此外,您的输入字符串在某个时间点符合 ISO 8601 标准,因此正好符合 Instant
class。不需要任何明确的格式化程序来解析它。我建议:
private static Instant parse(String inputString) {
try {
return Instant.parse(inputString);
} catch (DateTimeParseException dtpe) {
System.err.println("Parsing: " + dtpe);
return Instant.now();
}
}
使用方法如下,例如:
String inputString = "2017-06-01T01:00:00Z";
System.out.println(parse(inputString));
这会打印:
2017-06-01T01:00:00Z
好吧,这与您开始时使用的字符串相同,因为 Instant.toString()
生成相同的 ISO 8601 字符串。
我也承认 scottb 的一点:我们有时需要与确实需要老式 Date
实例的遗留代码进行互操作。如果是这种情况,请从 Date.from(parse(inputString))
中生成一个。这将产生一个 Date
等于瞬间(在我的计算机上打印为 Thu Jun 01 03:00:00 CEST 2017
因为那恰好是我的时区)。无论如何,我建议在输入旧代码之前的最后一刻转换为 Date
,以尽量减少您自己对它的使用。
只是为了实验,让我们尝试将您不正确的格式模式字符串与较新的 DateTimeFormatter
class:
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ").parse(inputString);
这会产生 java.time.format.DateTimeParseException: Text '2017-06-01T01:00:00Z' could not be parsed at index 19
。它试图对您有所帮助:2017-06-01T01:00:00Z
的索引 19 是 Z
的位置。正如其他两个答案所说,这正是格式模式与输入不匹配的地方。相信我,这只是众多示例中的一个,您从现代 classes 获得的帮助比旧的更好。
我已经实现了以下方法将 String
转换为 Date
因为 Date(String)
构造函数已被弃用:
private Date format(String inputString) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
try {
return dateFormat.parse(inputString);
} catch (ParseException e) {
return new Date();
}
}
一个 inputString
个样本是 2017-06-01T01:00:00Z
。但是,当我检查输出时,我发现异常处理程序被触发并返回 new Date()
,这意味着我的模式有问题:"Jun 17, 2017 1:12:02 PM"
.
模式 yyyy-MM-dd'T'HH:mm:ssZ
我错过了什么?
您的输入字符串中有文字 Z
,因此您也需要引用它(或使用 X
)。喜欢,
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
或更好(如评论中指出)
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
此外,不要丢弃异常(至少打印堆栈跟踪)。在 Java 8+ 中,您应该使用新的 java.time
类。这可能看起来像,
private static LocalDateTime format(String inputString) {
String pattern = "yyyy-MM-dd'T'HH:mm:ssX";
return LocalDateTime.from(DateTimeFormatter.ofPattern(pattern)
.parse(inputString));
}
Z
模式表示数字时区偏移量。因此,此处所需的偏移量为 +0000
.
X
模式允许您使用时区偏移量,例如 Z
。 (是的,这似乎违反直觉,但就是这样。)
我同意 Joe C 和 Louis Wassermann 的评论:如果有任何办法,请远离早已过时的 Date
class。还有。现代替代品 classes 非常方便,对程序员也很友好。
此外,您的输入字符串在某个时间点符合 ISO 8601 标准,因此正好符合 Instant
class。不需要任何明确的格式化程序来解析它。我建议:
private static Instant parse(String inputString) {
try {
return Instant.parse(inputString);
} catch (DateTimeParseException dtpe) {
System.err.println("Parsing: " + dtpe);
return Instant.now();
}
}
使用方法如下,例如:
String inputString = "2017-06-01T01:00:00Z";
System.out.println(parse(inputString));
这会打印:
2017-06-01T01:00:00Z
好吧,这与您开始时使用的字符串相同,因为 Instant.toString()
生成相同的 ISO 8601 字符串。
我也承认 scottb 的一点:我们有时需要与确实需要老式 Date
实例的遗留代码进行互操作。如果是这种情况,请从 Date.from(parse(inputString))
中生成一个。这将产生一个 Date
等于瞬间(在我的计算机上打印为 Thu Jun 01 03:00:00 CEST 2017
因为那恰好是我的时区)。无论如何,我建议在输入旧代码之前的最后一刻转换为 Date
,以尽量减少您自己对它的使用。
只是为了实验,让我们尝试将您不正确的格式模式字符串与较新的 DateTimeFormatter
class:
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ").parse(inputString);
这会产生 java.time.format.DateTimeParseException: Text '2017-06-01T01:00:00Z' could not be parsed at index 19
。它试图对您有所帮助:2017-06-01T01:00:00Z
的索引 19 是 Z
的位置。正如其他两个答案所说,这正是格式模式与输入不匹配的地方。相信我,这只是众多示例中的一个,您从现代 classes 获得的帮助比旧的更好。