目前我有一个String
字段,可以按以下格式存储日期:
"2017-04-19 godz. 20:00"
我需要将其解析为以下格式:
2017-04-19T20:00:00Z
你能否给我一个提示,我怎样才能在java
?
答案 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,提取Instant
。 Instant
类代表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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。