Как преобразовать строку без времени в полную дату со временем с помощью DateTimeFormatter

#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
 

ONLINE DEMO

Альтернативно,

 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
 

ONLINE DEMO

Узнайте больше о современном 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;
}