繁体   English   中英

如何将以字符串形式存储的日期解析为Java中的其他格式?

[英]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.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参见Oracle教程 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM