### 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
for (ChronoField field : FIELDS) {
                        if (accessor.isSupported(field)) {
                            newTime = newTime.with(field, accessor.get(field));
                        }
                    }
                    accessor = newTime.withZoneSameLocal(zoneId);
                }
                return DateFormatters.from(accessor, locale, zoneId).withZoneSameInstant(zoneId);
            };
        }
    };
    /** It's important to keep this variable as a constant because {@link DateFormatter#forPattern(String)} is an expensive method and,
     * in this case, it's a never changing value.
     * <br>
     * Also, we shouldn't inline it in the {@link DateFormat#Iso8601}'s enum because it'd make useless the cache used
     * at {@link DateProcessor}).
     */
    private static final DateFormatter ISO_8601 = DateFormatter.forPattern("iso8601");
    abstract Function<String, ZonedDateTime> getFunction(String format, ZoneId timezone, Locale locale);
    static DateFormat fromString(String format) {
        return switch (format) {
            case "ISO8601" -> Iso8601;
            case "UNIX" -> Unix;
            case "UNIX_MS" -> UnixMs;
            case "TAI64N" -> Tai64n;
            default -> Java;
        };
    }
}