Во-первых, вы пытаетесь решить задачу, которая не может быть решена. Трехбуквенные сокращения часовых поясов неоднозначны, я думаю, чаще всего нет. Поэтому, если вы решите проблему для Европы / Лондона, у вас будет это снова, когда вы встретитесь с EST, IST, CST, CDT, PST, WST и так далее, и так далее. Или когда вы встречаете строку, где BST должен был означать летнее время Бразилии, стандартное время Бангладеш или стандартное время Бугенвиля. Еще больше интерпретаций существует. Вместо этого получите однозначную строку, такую как строка со смещением UTC, а не сокращение часового пояса, лучше всего строку в формате ISO 8601, например 2019-06-07T14:07:07+01:00
.
Но если вы уверены, что BST всегда будет означать британское летнее время в вашем мире, близорукое решение может заключаться в том, чтобы сообщить DateTimeFormatter
, какой часовой пояс вы предпочитаете:
String sTime = "Fri Jun 07 14:07:07 BST 2019";
ZoneId preferredZone = ZoneId.of("Europe/London");
DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("EEE MMM dd HH:mm:ss ")
.appendZoneText(TextStyle.SHORT, Collections.singleton(preferredZone))
.appendPattern(" yyyy")
.toFormatter(Locale.ROOT);
ZonedDateTime zd = ZonedDateTime.parse(sTime, FORMATTER);
System.out.println("The time zone: " + zd.getZone());
FileTime ftReturn = FileTime.from(zd.toEpochSecond(), TimeUnit.SECONDS);
System.out.println("File time is: " + ftReturn);
Вывод:
The time zone: Europe/London
File time is: 2019-06-07T13:07:07Z
Ссылки