Supporting custom date formats when resolving a tsdb data stream to a backing index makes the logic on the coordinating node complicated, because the target backing index is unknown. It is only known after parsing the `@timestamp` field, but in order to parse the timestamp field the date format should be known and this information is stored in the mapping of a backing index.

In order to avoid unnecessary complexity when coordinating a bulk request we need to make the following changes:

- Only support `strict_date_optional_time` and `strict_date_optional_time_nanos` date formats for the `@timestamp` field in tsdb data streams. For now we don't expect that we need to support other date formats. In order to do this we also need to prohibit field mapping for the `@timestamp` field that allow any other date format for backing indices of tsdb data streams.
- When resolving the backing index for tsdb data streams on the coordinating node, truncate millisecond and nanosecond precision from the the timestamp only for determining to what backing index the document should be indexed into. Also the `DataStreamIndexSettingsProvider` should be adjusted to truncate ms/ns precision when setting the `index.time_series.start_time` and `index.time_series.end_time` index settings. Note that, on the data node when documents get indexed the timestamp do get parsed into a date value that confirms with the field mapping of the `@timestamp` field.

Note that currently only `strict_date_optional_time` and ms since epoch provided as long is supported for tsdb data streams (see this [TODO](https://github.com/elastic/elasticsearch/blob/master/server/src/main/java/org/elasticsearch/cluster/metadata/IndexAbstraction.java#L459)). 
test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java
fieldsMapping.put("type", DataStreamTimestampFieldMapper.NAME);
        fieldsMapping.put("enabled", true);
        MappingParserContext mockedParserContext = mock(MappingParserContext.class);
        return DataStreamTimestampFieldMapper.PARSER.parse("field", fieldsMapping, mockedParserContext).build();
    }
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static IndicesService mockIndicesServices(MappingLookup mappingLookup) throws Exception {
        /*
         * Throws Exception because Eclipse uses the lower bound for
         * CheckedFunction's exception type so it thinks the "when" call
         * can throw Exception. javac seems to be ok inferring something
         * else.
         */
        IndicesService indicesService = mock(IndicesService.class);
        when(indicesService.withTempIndexService(any(IndexMetadata.class), any(CheckedFunction.class))).then(invocationOnMock -> {
            IndexService indexService = mock(IndexService.class);
            IndexMetadata indexMetadata = (IndexMetadata) invocationOnMock.getArguments()[0];
            when(indexService.index()).thenReturn(indexMetadata.getIndex());
            MapperService mapperService = mock(MapperService.class);
            when(indexService.mapperService()).thenReturn(mapperService);
            when(mapperService.mappingLookup()).thenReturn(mappingLookup);
            when(indexService.getIndexEventListener()).thenReturn(new IndexEventListener() {
            });
            when(indexService.getIndexSortSupplier()).thenReturn(() -> null);
            return ((CheckedFunction<IndexService, ?, ?>) invocationOnMock.getArguments()[1]).apply(indexService);
        });
        return indicesService;
    }
}