#java #datetimeformatter
Вопрос:
Привет , я пытаюсь преобразовать a String
в дату с помощью DateTimeFormatter
,
например, "20210628"
to "Mon Jun 28 00:00:00 UTC 2021"
.
Это может быть легко достигнуто с помощью SimpleDateFormatter
, но я хочу достичь этого с помощью DateTimeFormatter
.
Комментарии:
1. Что вы пробовали до сих пор? Что не сработало? Не могли бы вы показать некоторые попытки, пожалуйста?
2. Начните выяснять , как добраться
String
до пункта аLocalDate
, а затем выясните, как попасть в пункт аLocalDateTime
илиZonedDateTime
на основе ваших требований3. Да, как уже упоминал деХаар, пожалуйста, покажите свою попытку. Если вы уже знаете , как это сделать с помощью a
SimpleDateFormatter
, то вы уже близки.
Ответ №1:
java.время
API java.util
даты и времени и их API форматирования SimpleDateFormat
устарели и подвержены ошибкам. Рекомендуется полностью прекратить их использование и переключиться на современный API даты и времени*.
Решение с использованием java.time
современного API для определения даты и времени:
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("uuuuMMdd", Locale.ENGLISH);
LocalDate date = LocalDate.parse("20210628", dtfInput);
OffsetDateTime odt = date.atTime(OffsetTime.of(LocalTime.MIN, ZoneOffset.UTC));
System.out.println(odt);
// Custom format
DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss O uuuu", Locale.ENGLISH);
System.out.println(dtfOutput.format(odt));
}
}
Выход:
2021-06-28T00:00Z
Mon Jun 28 00:00:00 GMT 2021
Альтернативно,
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("uuuuMMdd", Locale.ENGLISH);
LocalDate date = LocalDate.parse("20210628", dtfInput);
ZonedDateTime zdt = date.atStartOfDay(ZoneId.of("Etc/UTC"));
System.out.println(zdt);
// Custom format
DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss O uuuu", Locale.ENGLISH);
System.out.println(dtfOutput.format(zdt));
}
}
Выход:
2021-06-28T00:00Z[Etc/UTC]
Mon Jun 28 00:00:00 GMT 2021
Узнайте больше о современном API для определения даты и времени в разделе Trail: Дата и время.
Комментарии:
1. Я тоже это имел в виду… Но OP явно запросил идентификатор зоны
UTC
в выходныхString
данных . Мне потребовалось довольно много времени, чтобы понять, как это возможно 😉2. UTC и GMT-это одно и то же.
3. Да, я знаю, но это не одни и те же термины… ОП тоже мог бы принять
Z
«а».4. Тем не менее, ваш ответ добавляет ценности здесь.
Ответ №2:
Также используется другой подход java.time
…
Используйте a DateTimeFormatterBuilder
, чтобы получить полный контроль над String
конверсией.
Вот небольшой пример, который действительно печатает UTC
вместо GMT
или Z
в нужном выводе:
public static void main(String[] args) {
// example String
String value = "20210628";
// define a formatter that parses the example String
DateTimeFormatter dateParser = DateTimeFormatter.ofPattern("uuuuMMdd");
// define a formatter that converts to a String as desired
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendPattern("EEE MMM dd HH:mm:ss")
.appendLiteral(' ')
.appendZoneRegionId()
.appendLiteral(' ')
.appendPattern("uuuu")
.toFormatter(Locale.ENGLISH);
// parse the date and use the formatter in order to get the desired result
String otherValue = LocalDate.parse(value, dateParser)
// add the start of the day
.atStartOfDay()
// apply the desired zone
.atZone(ZoneId.of("UTC"))
// and format it
.format(dtf);
// finally print the conversion
System.out.println(value " ---> " otherValue);
}
Результат будет следующим:
20210628 ---> Mon Jun 28 00:00:00 UTC 2021
Ответ №3:
Если у вас уже есть объект LocalDateTime, вы можете использовать следующее.
String getFormattedDate(LocalDateTime datetime){
DateTimeFormatter formatterPreUTC = DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss");
DateTimeFormatter formatterPostUTC = DateTimeFormatter.ofPattern("YYYY");
String textPreUTCPart = datetime.format(formatterPreUTC);
String utc = " UTC ";
String textPostUTCPart = datetime.format(formatterPostUTC);
return textPreUTCPart utc textPostUTCPart;
}