使用相同的格式化器
在Joda-Time 2.3中,您需要使用相同的DateTimeFormatter对象来解析和print
(渲染字符串)。
时区
请注意,您的代码未考虑时区。在这种情况下,您将得到JVM的默认时区。这不是一个好习惯。
DateTime表示日期和时间。当仅解析日期部分的字符串时,时间部分会自动设置为一天中的第一刻钟。该第一刻钟因时区而异。因此,应用不同的时区会得到不同的结果,宇宙时间轴上的不同点,不同的自纪元以来的毫秒数。
请注意在定义格式化器时调用withZone
。
字符串
请记住,DateTime对象不是字符串。您可以通过以下两种方式生成包含在DateTime实例中的日期时间信息的字符串表示形式:
- 在DateTime实例上调用
toString
方法。
每个DateTime都有一个内置的ISO 8601 格式化程序,由“toString”方法自动使用。
- 实例化自己的
DateTimeFormatter
实例。
下面的示例代码中展示了这两种字符串生成技术。
示例代码
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Hong_Kong" );
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy" ).withZone( timeZone );
String input = "05/05/2013";
DateTime dateTime = formatter.parseDateTime( input );
String iso8601String = dateTime.toString();
DateTime dateTime2 = new DateTime( iso8601String, timeZone );
String output = formatter.print( dateTime2 );
与其硬编码特定格式,您可以软编码本地化格式。
String outputUS = DateTimeFormat.forStyle( "S-" ).withLocale( Locale.US ).print( dateTime2 );
String outputQuébécois = DateTimeFormat.forStyle( "F-" ).withLocale( Locale.CANADA_FRENCH ).print( dateTime2 );
转储到控制台...
System.out.println( "dateTime: " + dateTime );
System.out.println( "iso8601String: " + iso8601String );
System.out.println( "dateTime2: " + dateTime2 );
System.out.println( "output: " + output );
运行时...
dateTime: 2013-05-05T00:00:00.000+08:00
iso8601String: 2013-05-05T00:00:00.000+08:00
dateTime2: 2013-05-05T00:00:00.000+08:00
output: 05/05/2013
字符串不是日期时间
不要把日期时间对象看作字符串。
DateTime
没有格式。该类可以解析 ISO 8601 格式的字符串以实例化日期时间对象。同样,DateTimeFormatter
可以解析字符串以实例化日期时间对象。
相反地,DateTime
有一个 toString
实现,生成日期时间对象值的字符串表示形式。同样,DateTimeFormatter
可以生成日期时间对象值的字符串表示形式。
在所有这些情况下,字符串表示形式与日期时间对象完全不同且独立。
DateTime
对象,并按照MM/dd/yyyy
的格式进行格式化。 - Sotirios Delimanolis