# Indexing problem when missing milliseconds for strict\_date\_time field

**URL:** <https://discuss.elastic.co/t/indexing-problem-when-missing-milliseconds-for-strict-date-time-field/51028>\
**Category:** Elasticsearch\
**Created:** [May 26, 2016, 8:05am UTC](https://discuss.elastic.co/t/indexing-problem-when-missing-milliseconds-for-strict-date-time-field/51028 "2016-05-26T08:05:40Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![pdevalck](https://avatars.discourse-cdn.com/v4/letter/p/ed8c4c/32.png) [@pdevalck](https://discuss.elastic.co/u/pdevalck)\
**Post date:** [May 26, 2016, 8:05am UTC](https://discuss.elastic.co/t/indexing-problem-when-missing-milliseconds-for-strict-date-time-field/51028/1 "2016-05-26T08:05:40Z")

</div>

We have a problem with Elasticsearch 2.3.2.

When indexing a document that contains a Java Instant date with zero milliseconds (eg. Instant.now().truncatedTo(ChronoUnit.SECONDS) ) using the DateTimeFormatter.ISO\_INSTANT and when the field is mapped as:  
"creationTime": {  
"format": "strict\_date\_time||epoch\_millis",  
"type": "date"  
}  
we get the following exception from Elasticsearch:

Exception in thread "main" java.io.IOException: MapperParsingException[failed to parse [creationTime]]; nested: IllegalArgumentException[Invalid format: "2016-05-25T09:37:47Z" is malformed at "Z"];  
at com.swift.amw.qgate.authentication.providers.es.ESUserRegistry.createUser(ESUserRegistry.java:96)  
at com.swift.amw.qgate.authentication.providers.es.ESUserRegistry.addUser(ESUserRegistry.java:113)  
at com.swift.amw.qgate.authentication.providers.es.ESUserRegistry.addUser(ESUserRegistry.java:130)  
at com.swift.amw.qgate.authentication.providers.es.ESUserRegistryTest.main(ESUserRegistryTest.java:244)  
Caused by: MapperParsingException[failed to parse [creationTime]]; nested: IllegalArgumentException[Invalid format: "2016-05-25T09:37:47Z" is malformed at "Z"];  
at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:329)  
at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:309)  
at org.elasticsearch.index.mapper.DocumentParser.parseValue(DocumentParser.java:436)  
at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:262)  
at org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:122)  
at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:309)  
at org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:580)  
at org.elasticsearch.index.shard.IndexShard.prepareIndexOnPrimary(IndexShard.java:559)  
at org.elasticsearch.action.index.TransportIndexAction.prepareIndexOperationOnPrimary(TransportIndexAction.java:212)  
at org.elasticsearch.action.index.TransportIndexAction.executeIndexRequestOnPrimary(TransportIndexAction.java:224)  
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:158)  
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:66)  
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.doRun(TransportReplicationAction.java:639)  
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)  
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:279)  
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:271)  
at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:75)  
at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:376)  
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)  
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)  
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)  
at java.lang.Thread.run(Thread.java:745)  
Caused by: java.lang.IllegalArgumentException: Invalid format: "2016-05-25T09:37:47Z" is malformed at "Z"  
at org.joda.time.format.DateTimeParserBucket.doParseMillis(DateTimeParserBucket.java:187)  
at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:780)  
at org.elasticsearch.index.mapper.core.DateFieldMapper$DateFieldType.parseStringValue(DateFieldMapper.java:362)  
at org.elasticsearch.index.mapper.core.DateFieldMapper.innerParseCreateField(DateFieldMapper.java:528)  
at org.elasticsearch.index.mapper.core.NumberFieldMapper.parseCreateField(NumberFieldMapper.java:241)  
at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:321)  
... 21 more

The DateTimeFormatter.ISO\_INSTANT formatter drops the milliseconds from the generated string when they are zero. When having a value for milliseconds that is larger then zero, all is working fine.  
When changing the mapping to  
"creationTime": {  
"format": "strict\_date\_optional\_time||epoch\_millis",  
"type": "date"  
}  
all is working correctly.

Is this a correct behaviour? I want my field to always have a time part but allow for 0 milliseconds.

---

<div class="post-metadata">

**Author:** ![warkolm](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/warkolm/32/39224_2.png) [@warkolm](https://discuss.elastic.co/u/warkolm)\
**Post date:** [May 27, 2016, 6:18am UTC](https://discuss.elastic.co/t/indexing-problem-when-missing-milliseconds-for-strict-date-time-field/51028/2 "2016-05-27T06:18:49Z")

</div>

That appears to be correct behaviour, yes.

---

<div class="post-metadata">

**Author:** ![pdevalck](https://avatars.discourse-cdn.com/v4/letter/p/ed8c4c/32.png) [@pdevalck](https://discuss.elastic.co/u/pdevalck)\
**Post date:** [May 27, 2016, 8:12am UTC](https://discuss.elastic.co/t/indexing-problem-when-missing-milliseconds-for-strict-date-time-field/51028/3 "2016-05-27T08:12:18Z")

</div>

I believe the DateFieldMapper should invoke the org.joda.time formatter to parse the string more lenient. Or even better, migrate to java.time 😉

I have put in place a custom jackson Instant serializer that allows write out milliseconds, even when zero. Now, I can put back the strict\_date\_time format for my date fields.

---

<div class="post-metadata">

**Author:** ![warkolm](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/warkolm/32/39224_2.png) [@warkolm](https://discuss.elastic.co/u/warkolm)\
**Post date:** [May 28, 2016, 12:55am UTC](https://discuss.elastic.co/t/indexing-problem-when-missing-milliseconds-for-strict-date-time-field/51028/4 "2016-05-28T00:55:34Z")

</div>

Feel free to raise this on GH, we're always after ways to improve things! 🙂

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 5, 2017, 10:48pm UTC](https://discuss.elastic.co/t/indexing-problem-when-missing-milliseconds-for-strict-date-time-field/51028/5 "2017-07-05T22:48:25Z")

</div>


