字符串 != 日期
您的主要问题是将字符串视为日期。它不是。考虑到“$12.34”不是一个数字,它是一个数字和货币类型的文本表示形式,用于显示。你也有日期时间和时区的文本表示。
字符串 → 日期时间 → 字符串
所以第一步是将该字符串解析为日期时间对象。然后使用该日期时间对象生成其日期时间值的新文本表示。
java.time
您正在使用 Java 最早版本中的旧日期时间类。这些课程虽然是业界首创的勇敢尝试,但已被证明令人困惑且存在缺陷。避开他们。
Java 8 和更高版本中内置的java.time框架取代了麻烦的旧 java.util.Date/.Calendar 类。新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继任者,在概念上相似但重新架构。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Oracle 教程。
格式化程序
我们必须指定一个编码模式来定义一个格式化程序,我们将使用它来解析您的输入字符串。这些代码类似于旧的 java.text.SimpleDateFormat 类,但不完全相同。所以仔细研究文档。注意O
for的使用localized zone-offset
。
请注意,在格式化程序上,我们使用第二个参数来指定Locale
. 该语言环境指定用于解析和翻译月份和日期名称的人类语言。如果省略,则使用 JVM 当前的默认语言环境。该默认值可以随时更改,因此我建议始终指定预期的语言环境。
String input = "Thu Feb 02 12:00:00 GMT-12:00 2012";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss O yyyy" , Locale.ENGLISH );
ZonedDateTime zdt = ZonedDateTime.parse ( input , formatter );
转储到控制台。
System.out.println ( "zdt: " + zdt );
2012-02-02T12:00-12:00
该输出是标准的ISO 8601格式。我建议尽可能使用这些标准格式,因为它们易于阅读、明确且标准。
您想要的格式接近标准,但用T
空格替换。并且您的格式省略了任何与 UTC或时区的偏移量。省略时区是有风险的,因为人类读者可能会假设错误的时区。但是,如果您坚持,请自己定义这样的模式。
DateTimeFormatter formatterOutput = DateTimeFormatter.ofPattern ( "yyyy-MM-dd HH:mm:ss" );
String output = zdt.format ( formatterOutput );
转储到控制台。
System.out.println ( "zdt: " + zdt + " output: " + output );
zdt:2012-02-02T12:00-12:00 输出:2012-02-02 12:00:00
更好的是,让 java.time 为您本地化。请注意我们如何调用withLocale
给格式化程序一个 Locale,其语言将用于月份名称和日期名称。
DateTimeFormatter formatterLocalized = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL );
formatterLocalized = formatterLocalized.withLocale ( Locale.CANADA_FRENCH );
String outputLocalized = zdt.format ( formatterLocalized );
转储到控制台。
System.out.println ( "zdt: " + zdt + " output: " + output + " outputLocalized: " + outputLocalized );
zdt:2012-02-02T12:00-12:00 输出:2012-02-02 12:00:00 输出本地化:jeudi 2 février 2012 12 h 00 -12:00