answer by Jon Skeet 正确且完整。
在 java.util.Date 内部(以及如下所示的日期时间),日期时间值存储为自 Unix epoch 以来的毫秒数。 里面没有字符串! 当您需要以人类可读格式的日期时间的文本表示时,请调用 toString 或使用格式化程序对象来创建 一个字符串对象。同样,在解析时,输入字符串会被丢弃,而不是存储在 Date 对象(或 Joda-Time 中的 DateTime 对象)中。
乔达时间
为了好玩,这里是使用Joda-Time 完成这项工作的(更好的)方法,正如 Skeet 先生所提到的那样。
一个主要区别是,虽然 java.util.Date 类 似乎 有一个时区,但它没有。相比之下,Joda-Time DateTime 确实知道自己的时区。
String input = "11/26/2011 14:47:31";
// From text to date-time.
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Time zone intended but unrecorded by the input string.
DateTimeFormatter formatterInput = DateTimeFormat.forPattern( "MM/dd/yyyy HH:mm:ss" ).withZone( timeZone );
// No words in the input, so no need for a specific Locale.
DateTime dateTime = formatterInput.parseDateTime( input );
// From date-time to text.
DateTimeFormatter formatterOutput_MontréalEnFrançais = DateTimeFormat.forStyle( "FS" ).withLocale( java.util.Locale.CANADA_FRENCH ).withZone( DateTimeZone.forID( "America/Montreal" ) );
String output = formatterOutput_MontréalEnFrançais.print( dateTime );
转储到控制台...
System.out.println( "input: " + input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime as milliseconds since Unix epoch: " + dateTime.getMillis() );
System.out.println( "dateTime in UTC: " + dateTime.withZone( DateTimeZone.UTC ) );
System.out.println( "output: " + output );
运行时……
input: 11/26/2011 14:47:31
dateTime: 2011-11-26T14:47:31.000-10:00
dateTime as milliseconds since Unix epoch: 1322354851000
dateTime in UTC: 2011-11-27T00:47:31.000Z
output: samedi 26 novembre 2011 19:47
在 StackOverflow 中搜索“joda”以查找更多示例。