### Description

I would like to be able to parse unix epoch timestamps that contain a fractional value with nanosecond precision (e.g. `1647479604.334549372`). These currently parse, but only millisecond precision is retained. Given that the date processor supports nanosecond output formats, I think it would be good to retain the nanosecond precision.

```
POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "date": {
          "field": "message",
          "formats": [
            "UNIX"
          ],
          "output_format": "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSXXX"
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "message": "1647479604.334549372"
      }
    }
  ]
}
```

Output:

```
{
  "docs" : [
    {
      "doc" : {
        "_index" : "_index",
        "_id" : "_id",
        "_source" : {
          "@timestamp" : "2022-03-17T01:13:24.334000000Z", # NOTE: This only contains millisecond precision.
          "message" : "1647479604.334549372"
        },
        "_ingest" : {
          "timestamp" : "2022-04-23T02:15:28.600856847Z"
        }
      }
    }
  ]
}
```

My assumption is that the cast to long truncates the everything after the millis at

https://github.com/elastic/elasticsearch/blob/ce6d2e7f31ab7c7c36cc49eb708549b64f68086a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/DateFormat.java#L49


modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/DateFormat.java
return ((base * 1000) - 10000) + (rest / 1000000);
        }
    },
    Java {
        private final List<ChronoField> FIELDS = Arrays.asList(
            NANO_OF_SECOND,
            SECOND_OF_DAY,
            MINUTE_OF_DAY,
            HOUR_OF_DAY,
            DAY_OF_MONTH,
            MONTH_OF_YEAR
        );
        @Override
        Function<String, ZonedDateTime> getFunction(String format, ZoneId zoneId, Locale locale) {
            
            if (format.startsWith("8")) {
                format = format.substring(1);
            }
            DateFormatter dateFormatter = DateFormatter.forPattern(format).withLocale(locale);
            final DateFormatter formatter = dateFormatter;
            return text -> {
                TemporalAccessor accessor = formatter.parse(text);
                
                
                if (accessor.isSupported(ChronoField.YEAR) == false
                    && accessor.isSupported(ChronoField.YEAR_OF_ERA) == false
                    && accessor.isSupported(WeekFields.of(locale).weekBasedYear()) == false
                    && accessor.isSupported(ChronoField.INSTANT_SECONDS) == false) {
                    int year = LocalDate.now(ZoneOffset.UTC).getYear();
                    ZonedDateTime newTime = Instant.EPOCH.atZone(ZoneOffset.UTC).withYear(year);