如何将存储为String的日期解析为Java中的其他格式?

时间:2017-02-10 10:42:16

标签: java

目前我有一个String字段,可以按以下格式存储日期:

"2017-04-19 godz. 20:00"

我需要将其解析为以下格式:

2017-04-19T20:00:00Z

你能否给我一个提示,我怎样才能在java

3 个答案:

答案 0 :(得分:1)

对Java 8使用java.time.format.DateTimeFormatter

java.text.SimpleDateFormat for Java 7。

答案 1 :(得分:1)

如果有其他人需要示例代码:

SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd 'godz.' HH:mm");
SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

String dateStr = "2017-04-19 godz. 20:00";

Date date = sourceFormat.parse(dateStr);
String formattedDate = targetFormat.format(date);

System.out.println(formattedDate);

输出是: 2017-04-19T20:00:00Z

答案 2 :(得分:0)

定义一个格式模式,希望这些字符存在,并忽略它们。

指定Locale以确定(a)用于翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号等问题的文化规范。在这种特定情况下,语言环境可能没有效果,但通常最好作为指定Locale的习惯,而不是隐式依赖JVM的当前默认语言环境。

Locale locale = new Locale( "pl" , "PL" ); 
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd 'godz.' HH:mm" ).withLocale( locale ) ;

使用该格式化程序将字符串解析为LocalDateTime,因为它没有任何时区指示或offset-from-UTC

String input = "2017-04-19 godz. 20:00" ;
LocalDateTime ldt = LocalDateTime.parse( input , f );

您说您想要一个UTC值,但您的输入字符串不表示任何时区或偏移量。如果您根据业务问题的上下文知道该字符串的偏移量或区域,请应用区域或偏移量。如果您不知道偏移/区域,则没有解决方案。

我会随意使用Europe/Warsaw的时区作为例子。

ZoneId z = ZoneId.of( "Europe/Warsaw" );
ZonedDateTime zdt = ldt.atZone( z );

对于UTC,提取InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = zdt.toInstant();

如果预期的区域/偏移是UTC,则使用OffsetDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

您所需的输出符合日期时间格式的现代ISO 8601标准。在生成/解析字符串时,java.time类默认使用ISO 8601格式。所以只需致电toString

String output = instant.toString();

请参阅此code run live in IdeOne.com

  

ldt.toString():2017-04-19T20:00

     

zdt.toString():2017-04-19T20:00 + 02:00 [欧洲/华沙]

     

instant.toString():2017-04-19T18:00:00Z

请注意,日期时间对象不是字符串。日期时间对象可以解析表示日期时间值的字符串,并且可以生成表示日期时间值的字符串。但是字符串对象是不同的,与日期时间对象是分开的。换句话说,日期时间对象本身并不“具有格式”。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore