2016-11-07 96 views
-1

我正在尝试构建ISO 8601格式(“yyyy-MM-dd'T'HH:mm:ss.SSSXXX”)。使用Java 8 DateFormatBuilder解析ISO 8601格式的字符串。Java 8用于构建ISO 8601的DateFormatBuilder API日期格式

当我遇到UTC时间格式的输出是“2016-11-01T16:51:35.000Z”,但我真正需要的是有00:00而不是Z.我尝试DateFormatBuilder建立,但没有成功。

我终于结束了做以下

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
DATETIMEFOMATTER = builder.parseCaseInsensitive() 
       .append(DateTimeFormatter.ISO_OFFSET_DATE_TIME) 
       .toFormatter(); 

ZonedDateTime zonedDate = ZonedDateTime.parse(date, DATETIMEFOMATTER); 
     String utcDate = zonedDate.format(FORMATTER); 
     if (utcDate.indexOf("Z") != -1){ 
      utcDate = utcDate.replace("Z", "-00:00"); 
     } 

我不想解析字符串并与“00:00”取代ž。 Joda API更容易处理。任何想法,如果我们可以使用Java 8 DateTimeFormatterBuilder构建?我确实提到了几个stackoverflow问题,但没有工作。我可能做错了什么。有人可以帮忙吗?

+0

['appendPattern'](https://docs.oracle.com/javase/8/docs/api /java/time/format/DateTimeFormatterBuilder.html#appendPattern-java.lang。串-)?您在问题中编写了格式,我不确定问题是什么。 – Tunaki

+0

那不适合我。 – Milind

+0

请定义“不工作”。发布尝试,以及例外/或其他发生的事情? – Tunaki

回答

1

内置

支持ISO 8601标准格式的日期时间值被内置到java.time类。不需要指定格式化模式。

您的输入字符串可以由Instant类直接解析。

Instant instant = Instant.parse("2016-11-01T16:51:35.000Z"); 

为了根据需要在三(0,3,6,或9位)基团产生了类似的字符串与尽可能多的小数第二位,只需调用toString()

String output = instant.toString(); 

2016-11-01T16:51:35Z

Z是标准的,通用的业务,航空航天和军事。 ZZulu的缩写,意思是UTC。

尽管Z应该是完全可以接受的,但您似乎要求UTC的偏移量为零小时零分钟数+00:00。虽然零小时&分钟的正数也可以接受,-00:00接受,违反ISO 8601您的问题的使用一个负零偏移到了正零被替换的需求。

请注意,RFC 3339被认为是ISO 8601的配置文件,但打破了这一规则,允许负零点偏移,并给出了一个特殊和令人困惑的含义。不是RFC 3339中唯一可怜的设计决定。因此,我建议避免使用RFC并严格遵守ISO 8601。

为了容易地得到正值为0的字符串,并且不明确地打上DateTimeFormatter,请使用OffsetDateTime,同时指定UTC的偏移量已定义为常数ZoneOffset.UTC。然后只需拨打toString即可。

OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC); 
String output = odt.toString(); 

2016-11-01T16:51:35 + 00:00

+0

我需要这两个输出2016-10-31T17:10:10.304-04:00和2016-11-01T16:51:35.000-00:00来自同一功能。我会看到如果这是可能的。我必须拥有-00:00的格式,因为我所消费的服务需要这种服务。 – Milind

+1

@Milind重读我的答案,因为我警告不要使用负零。至于需要'-04:00',我应该认为班级名称OffsetDateTime是一个线索。你有没有费力去看班级文件? –

+0

我会用它并回复你。谢谢你的回应。 – Milind