[英]how can I parse my date stored as a String to a different format in Java?
目前,我有一个String
字段,它以以下格式存储日期:
"2017-04-19 godz. 20:00"
我需要将其解析为以下格式:
2017-04-19T20:00:00Z
你能给我一个提示,我怎么用java
做到这一点?
对Java 8使用java.time.format.DateTimeFormatter
。
或Java 7的java.text.SimpleDateFormat
。
如果其他人需要示例代码:
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
定义一个期望该字符存在的格式设置模式,然后忽略它们。
指定Locale
以确定(a)用于翻译日名,月名等的人类语言,以及(b)决定缩写,大写,标点符号等问题的文化规范。 语言环境在这种特定情况下可能没有影响,但通常最好将其作为指定Locale
的习惯,而不是隐式依赖JVM当前的默认语言环境。
Locale locale = new Locale( "pl" , "PL" );
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd 'godz.' HH:mm" ).withLocale( locale ) ;
使用该格式化程序将字符串解析为LocalDateTime
因为它没有任何时区或从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表示时间轴上的时刻,分辨率为纳秒 (最多十进制的九(9)位数字)。
Instant instant = zdt.toInstant();
如果预期的区域/偏移量是UTC,则使用OffsetDateTime
。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
您所需的输出恰好符合现代ISO 8601标准的日期时间格式。 并且在生成/解析字符串时,默认情况下java.time类使用ISO 8601格式。 因此,只需调用toString
。
String output = instant.toString();
看到此代码在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及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程 。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310 。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.