1

我正在尝试将一个字符串解析为一种格式yyyy-MM-dd,而将一个字符串解析为yyyy-MM-dd HH:mm:ss. 我正在使用SimpleDateFormat.

我之前成功地使用了相同的方法,但现在出了点问题。我得到标准格式的日期,即Tue Mar 05 00:00:00 GMT+05:30 2012(for yyyy-MM-dd) 和Mon Mar 05 13:01:35 GMT+05:30 2012(for yyyy-MM-dd HH:mm:ss),因为我需要它们,2012-03-05并且分别2012-03-05 13:01:35

这就是我所做的:

Date today = new Date();
SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    today = tsdf.parse(tsdf.format(new Date()));
} catch(Exception e) {
    System.out.println("Error occurred"+ e.getMessage());
}

System.out.println(today);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
    // I recieve a string in this format here (refers to 5 march 2012).
    myDate = sdf.parse('2012-03-05');            
    System.out.println(myDate);
} catch(Exception e) {
    System.out.println("Error occurred "+ e.getMessage());
}
4

4 回答 4

3

您不是在输出作为格式化程序结果的字符串,而是在输出实际的日期对象。这将始终是 Date.toString() 的结果,对于您使用的 JDK,它就是您看到的格式。不要将格式化的字符串转回日期对象,只需将其打印出来!

SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    String formattedDate = tsdf.format(new Date());
} catch(Exception e) {
    System.out.println("Error occurred"+ e.getMessage());
}

System.out.println(formattedDate);

您不能将“格式”应用于java.util.Date对象以供以后使用。它只是一个原始的毫秒数,它的 toString 方法将始终打印相同的表示。您必须将其转换为格式化字符串并使用该字符串。

于 2012-03-05T08:49:42.280 回答
2
today = tsdf.parse(tsdf.format(new Date()));
System.out.println(today);

在我看来,正如您所期望的那样,Date实例被格式化。事实并非如此。一个Date实例表示可以格式化为“到”字符串的日期。它是一个简单地保存一个long值的类(意思是“以毫秒为单位的时间”)。

这将给出预期的结果:

Date today = new Date();
String formattedDate = tsdf.format(today);
System.println(formattedDate);     // <- we print the string!!
于 2012-03-05T08:51:52.133 回答
0

如果你想格式化一个Date实例,你不必使用parse方法,你必须使用format方法如下:

    Date today = new Date();
    SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd");
    try
    {
        System.out.println(tsdf.format(today));
    }
    catch (Exception e)
    {
        System.out.println("Error occurred" + e.getMessage());
    }

parse用于将字符串转换为日期的format方法和用于Date按指定格式将实例格式化为字符串的方法。

于 2012-03-05T08:54:05.563 回答
0

java.time

您正在使用旧的麻烦的日期时间类,现在已被 java.time 类所取代。

java.time框架内置于 Java 8 及更高版本中这些类取代了旧的麻烦的日期时间类,例如java.util.Date, .Calendar, & java.text.SimpleDateFormatJoda-Time团队还建议迁移到 java.time 。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。

许多 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP进一步适应 Android 。

LocalDate

对于仅日期值,请使用LocalDate类。您的输入值采用标准 ISO 8601 格式。默认情况下,java.time 类中使用 ISO 8601 格式来解析和生成表示日期时间值的字符串。所以不需要指定格式模式。

LocalDate localDate = LocalDate.parse( "2012-03-05" );

要生成这样的字符串,请调用toString.

String output = localDate.toString();

LocalDateTime

对于像2012-03-05 12:34:56我们这样的字符串有问题。未指示与 UTC 或时区的偏移量。所以它并不代表时间线上的实际时刻,而是关于可能时刻的粗略概念。这个非时刻由LocalDateTime类在 java.time 中表示。

您的字符串格式是 ISO 8601 的变体,而规范版本T在中间有一个而不是空格。因此,一种选择是将 SPACE 替换为T.

LocalDateTime ldt = LocalDateTime.parse( "2012-03-05 12:34:56".replace( " " , "T" );

或者定义一个模式。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd hh:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse( "2012-03-05 12:34:56" , formatter );

如果确实要表示时间轴上的实际时刻,请避免使用缺少偏移量或时区信息的日期时间格式。

ZonedDateTime

为了赋予该值意义,为了确定时间线上的实际时刻,我们需要分配日期时间所针对的时区。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );

调用toString通过在方括号中附加时区名称来生成一个扩展 ISO 8601 标准格式的字符串。

String output = zdt.toString(); // Yields: 2012-03-05T12:34:56-04:00[America/Montreal]

如果你想省略T你可以用 SPACE usingString::replace方法替换。或者使用格式化程序。如果您真的想要问题中缺少任何偏移量或时区信息的字符串(违反我的建议),请使用上面显示的相同格式化程序。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd hh:mm:ss" );  // Not recommended as it lacks offset/zone info.
String output = zdt.format( formatter );  // Yields: 2012-03-05 12:34:56
于 2016-07-23T04:33:26.893 回答