格式化字符串到日期的转换,而不改变java中的格式



我已经将日期格式化为字符串形式,我希望它为日期格式,而不更改格式化模式

这是我的代码

Date currDate = new Date();//Fri Oct 31 03:48:24 PDT 2014
    String pattern = "yyyy-MM-dd hh:mm:ss";
    SimpleDateFormat formatter;
    formatter = new SimpleDateFormat(pattern);
    String formattedDate= formatter.format(currDate);//2014-10-31 04:23:42

这里得到的是"yyyy-MM-dd hh:MM:ss"格式和我想要的日期格式相同。

 SimpleDateFormat sdf = new SimpleDateFormat(pattern);
 Date paidDate = sdf.parse(formattedDate);
System.out.println(pattern + " " + paidDate);//Fri Oct 31 03:48:24 PDT 2014

但我在2014年10月31日星期五03:48:24 PDT得到结果,所以请帮助我在2014-10-31 04:23:42以日期格式得到结果

如果我正确理解你的问题:

System.out.println(pattern + " " + sdf.format(paidDate);

您似乎有一种错误的印象,认为Date对象以某种方式编码了原始日期的格式。事实并非如此。

所以。。。当你这样做时:

Date paidDate = sdf.parse(formattedDate);

它不"记住"CCD_ 2中日期的文本形式的原始格式。它不能。如果要以默认格式以外的任何格式打印/取消分析日期,则应使用DateFormat并调用其format方法。调用toString()只会以默认格式为您提供日期。

试试这个。

System.out.println(格式化程序.format(paidDate));

tl;dr

不要将日期-时间对象与表示其值的字符串混为一谈。日期-时间对象没有"格式"。

ZonedDateTime.now(                                         // Instantiate a `ZonedDateTime` object capturing the current moment.
    ZoneId.of( "Africa/Tunis" )                            // Assign this time zone through which we see the wall-clock time used by the people of this particular region.
).format(                                                  // Generate a string representing the value of this `ZonedDateTime` object.
    DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" )   // Define a formatting pattern to match your desire.
)

2018-03-10 07:36:23

调用ZonedDateTime::toString会生成一个标准ISO 8601格式的字符串。

2018-03-10T07:36:23595362+01:00【非洲/突尼斯】

日期-时间对象没有"格式"

您将Java中的日期-时间对象或存储在数据库中的日期时间值与文本表示混淆。您可以从日期-时间对象(或数据库值)生成字符串,但该字符串与它所代表的值是独立的。不要将字符串与其生成创建者混为一谈。

java.time

避免使用麻烦的旧日期时间类,如DateCalendarSimpleDateFormat。而是分别使用InstantZonedDateTimeDateTimeFormatter类。

如果有输入字符串(如2014-10-31 04:23:42),请将中间的SPACE替换为T,以符合ISO 8601标准格式。在解析/生成字符串时,java.time类默认使用ISO8601格式。

String input = "2014-10-31 04:23:42".replace( " " , "T" ) ;

该输入缺少任何时区或UTC偏移量的指示器。因此,解析为LocalDateTime,它故意缺乏任何区域/偏移的概念。

LocalDateTime ldt = LocalDateTime.parse( input ) ;

ldt.toString():2014-10-31T04:23:42

LocalDateTime代表一个时刻,是不是时间线上的一个点。若要确定实际力矩,必须提供分区或偏移的上下文。

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;  // Now we have an actual moment, a point on the timeline.

要捕捉UTC中的当前时刻,请使用Instant

Instant instant = Instant.now() ;

调整到另一个区域。

ZonedDateTime zdt = instant.atZone( z ) ;

zdt.toString():2018-03-10T07:36:23595362+01:00【非洲/突尼斯】

我不建议生成缺少区域/偏移指示符的字符串。但如果你坚持使用内置的DateTimeFormatter,然后用SPACE替换中间的T,以获得你想要的格式。

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " ) ;

2018-03-10 07:36:23.595362

如果你真的不想要小数秒,那么定义你自己的格式模式。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ) ; 
String output = zdt.format( f ) ;

2018-03-10 07:36:23


关于java.time

java.time框架构建在Java8及更高版本中。这些类取代了诸如paidDate0、Calendar、&CCD_ 22。

现在处于维护模式的JodaTime项目建议迁移到java.Time类。

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

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java.sql.*类。

从哪里获得java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置
    • 标准Java API的一部分,带有捆绑实现
    • Java 9添加了一些小功能和修复程序
  • Java SE 6Java SE 7
    • 大部分java.time功能都是向后移植到Java6&7英寸ThreeTen背包
  • 安卓
    • java.time类的Android捆绑包实现的后续版本
    • 对于早期的Android(<26),ThreeTenABP项目适用于ThreeTen Backport(如上所述)。请参阅如何使用ThreeTenABP…

ThreeTen Extra项目通过附加类扩展java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。

最新更新