【问题标题】:Java converting a Date to a different formatJava将日期转换为不同的格式
【发布时间】:2014-02-11 19:18:29
【问题描述】:

我有一个这种格式的日期字符串:

String fieldAsString = "11/26/2011 14:47:31";

我正在尝试将其转换为以下格式的 Date 类型对象:"yyyy.MM.dd HH:mm:ss"

我尝试使用以下代码:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
Date newFormat = sdf.parse(fieldAsString);

但是,这会引发一个异常,即它是一个不可解析的日期。

所以我尝试了这样的事情:

Date date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse(fieldAsString);
String newFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(date)

但是,这种新格式现在是“字符串”格式,但我希望我的函数将新的格式化日期作为“日期”对象类型返回。我该怎么做?

谢谢!

【问题讨论】:

标签: java date


【解决方案1】:

您似乎认为Date 对象具有格式。它没有。听起来你只需要这个:

Date date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse(fieldAsString);

(请注意,您应该考虑指定区域设置和可能的时区。)

那么你就有了Date 值。格式仅在您以后想将其转换为文本时才相关... 那是 您应该指定格式的时候。将被表示的值(在这种情况下为瞬间)与潜在的文本表示分开是很重要的。这就像整数 - 这两个值之间没有 区别:

int x = 0x10;
int y = 16;

它们是相同的值,只是在源代码中表示不同。

另外考虑将Joda Time 用于您的所有日期/时间工作 - 它是一个比java.util.* 更简洁的 API。

【讨论】:

  • 重新括号中的句子 - 我同意指定时区,绝对。但是指定一个语言环境——你为什么要这样做?如果格式为"MM/dd/yyyy HH:mm:ss",则其中没有任何依赖于语言环境的内容。
  • @DavidWallace:日历系统取决于区域设置。我怀疑 OP 总是想使用公历。 (我预计日期和时间分隔符也取决于语言环境,但显然它们不在 SimpleDateFormat 中。)
  • 哇,真的吗?因此,如果我将SimpleDateFormat 的语言环境设置为伊朗,它将适用于波斯历吗?这有点酷。我看到我有一些实验要做。 :-)
  • @DavidWallace:不确定波斯历,但我相信你可以得到一个泰国的佛教日历,例如...#
  • 谢谢你,乔恩;我有一种感觉,我今天会玩得很开心。投赞成票!
【解决方案2】:

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”以查找更多示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2017-07-28
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多