Вы можете изменить этот ответ , чтобы вернуть эпоху миллис, как
static long dateTimeStringToEpoch(String s, String pattern) {
return DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)
.parse(s, Instant::from).toEpochMilli();
}
Или, если вы даже хотите избежать строительства временного Instant
:
static long dateTimeStringToEpoch(String s, String pattern) {
return DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)
.parse(s, ta -> ta.getLong(ChronoField.INSTANT_SECONDS)*1000
+ta.get(ChronoField.MILLI_OF_SECOND));
}
Обратите внимание, что оба, DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)
и ta -> ta.getLong(ChronoField.INSTANT_SECONDS)*1000+ta.get(ChronoField.MILLI_OF_SECOND)
, являются здесь повторно используемыми компонентами, например, Вы могли бы сделать
static final DateTimeFormatter MY_PATTERN
= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneOffset.UTC);
static final TemporalQuery<Long> EPOCH_MILLIS
= ta -> ta.getLong(ChronoField.INSTANT_SECONDS)*1000+ta.get(ChronoField.MILLI_OF_SECOND);
и
long millis = MY_PATTERN.parse("2018-07-21 18:30", EPOCH_MILLIS);
Вопрос в том, сколько строк различного формата вы ожидаете встретить в вашем приложении. Как правило, это не то, что меняется так часто, как форматированные даты, которые вы должны проанализировать. Может быть полезно создать отображение кэша из строки формата в подготовленную DateTimeFormatter
. В любом случае лямбда-выражение - это одноэлементное выражение.