Конвертировать java.util.Date в строку


407

Я хочу преобразовать java.util.Dateобъект вString в Java.

Формат 2010-05-30 22:15:52



@harschware К вашему сведению, проект Joda-Time сейчас находится в режиме обслуживания , и команда советует перейти на классы java.time . Смотрите Учебник по Oracle .
Василий Бурк

1
Рекомендую не использовать и Dateв 2019 году. Этот класс плохо спроектирован и давно устарел. Вместо этого используйте Instantили другой класс из java.time, современный API даты и времени Java .
Оле В.В.

Ответы:


757

Преобразовать дату в строку, используя DateFormat#formatметод:

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

С http://www.kodejava.org/examples/86.html


25
зачем использовать Calendarвместо простого new Date()? Есть ли разница?
Александр Малахов

10
Осторожно: SimpleDateFormat не является потокобезопасным. stackoverflow.com/questions/6840803/…
Загс

23
Календарь - это абстрактный класс, Дата конкретна. Дата не имеет ни малейшего представления о TimeZone, Locale или о других хороших вещах, которые мы никогда не используем.
nckbrz

30
MM/dd/yyyyФормат глупо и сломан. Не используйте его. Всегда используйте dd/MM/yyyyили yyyy-MM-dd.
SystemParadox,

13
@ SystemParadox - это глупо, но это не делает его бессмысленным. Меня специально попросили использовать его, потому что он соответствует тому, что люди ожидают в отчетах. (Я бы предпочел yyyy-MM-ddвезде, но что вы можете сделать?).
Осенний Леонард


63

Commons-lang DateFormatUtils полон вкусностей (если у вас есть commons-lang в вашем пути к классам)

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");

Требуется дополнительная nullпроверка.
Фаррух Чишти

23

ТЛ; др

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

java.time

Современный способ заключается в использовании классов java.time, которые теперь вытесняют проблемные старые унаследованные классы даты и времени.

Сначала конвертируйте java.util.Dateв Instant. InstantКласс представляет собой момент на шкале времени в формате UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

Преобразование в / из java.time выполняется новыми методами, добавленными к старым классам.

Instant instant = myUtilDate.toInstant();

И твой java.util.Dateи java.time.Instantв UTC . Если вы хотите видеть дату и время как UTC, пусть будет так. Вызов toStringдля генерации строки в стандартном формате ISO 8601 .

String output = instant.toString();  

2014-11-14T14: 05: 09Z

Для других форматов вам нужно превратить ваш Instantв более гибкий OffsetDateTime.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString (): 2020-05-01T21: 25: 35.957Z

Посмотрите, как работает этот код на IdeOne.com .

Чтобы получить строку в желаемом формате, укажите DateTimeFormatter. Вы можете указать пользовательский формат. Но я бы использовал один из предопределенных форматеров ( ISO_LOCAL_DATE_TIME) и заменил бы Tв его выводе пробел.

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Кстати, я не рекомендую такой формат, когда вы намеренно теряете смещение от UTC или информацию о часовом поясе. Создает неоднозначность относительно значения даты-времени этой строки.

Также остерегайтесь потери данных, поскольку любая дробная секунда игнорируется (эффективно усекается) в представлении вашей строки значения даты и времени.

Чтобы увидеть тот же момент через призму часов определенного региона , примените a, ZoneIdчтобы получить a ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Америка / Монреаль]

Чтобы создать форматированную строку, сделайте то же, что и выше, но замените odtна zdt.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Если этот код выполняется очень много раз, вы можете захотеть быть более эффективным и избегать вызова String::replace. Удаление этого вызова также делает ваш код короче. При желании укажите свой собственный шаблон форматирования в своем собственном DateTimeFormatterобъекте. Кэшируйте этот экземпляр как константу или член для повторного использования.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

Примените этот форматер, передав экземпляр.

String output = zdt.format( f );

О java.time

Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые классы даты и времени , такие как java.util.Date, .Calendar, и java.text.SimpleDateFormat.

Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на java.time.

Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений.

Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP (см. Как использовать… ).

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time.


Вот примеры кода форматирования с помощью Java 8 Time API: stackoverflow.com/a/43457343/603516
Вадим

этот код не работает OffsetDateTime odt = instant.atOffset (ZoneOffset.UTC); odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 Существует ли новый код Java 8 для того же формата 2014-11-14T14: 05: 09 + 00: 00? Спасибо
Боб Болден

@BobBolden Вы правы, Zиспользуется вместо +00:00по умолчанию. Я исправил ответ, спасибо. К вашему сведению, это означает одно и то же: Zпроизносится «Зулу» означает смещение нуля часов, минут и секунд, то же самое, что и +00:00. Стандарт ISO 8601 поддерживает оба стиля.
Василий Бурк

@BasilBourque извините, это неясно. У меня есть Java 8 и там нет Instant.atOffset () вообще. Не могли бы вы посоветовать, какой должен быть правильный код для Java 8, чтобы он имел точно такой же формат 2014-11-14T14: 05: 09 + 00: 00 без instant.atOffset ()? Я немного растерялся :(
Боб Болден

@BobBolden Существует действительно atOffsetметод на Instantкласс в Java 8. См Javadoc: Instant::atOffset. В Java 8 Instant.now().atOffset( ZoneOffset.UTC ).toString()будет выполняться вызов like . Проверьте свои importзаявления. Убедитесь, что ваш IDE / проект настроен для запуска Java 8 или более поздней версии, а не более ранней версии Java. Смотрите код запуска в прямом эфире на IdeOne.com: ideone.com/2Vm2O5
Василий Бурк

19

Альтернативные однострочники в простой старой Java:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

При этом используется Formatter и относительное индексацию вместо SimpleDateFormatкоторого не поточно- , кстати.

Чуть более повторяющийся, но нужно только одно утверждение. Это может быть удобно в некоторых случаях.


1
Это (в) гений. Гораздо лучшая производительность в стесненных условиях
Руслан

9

Почему вы не используете Joda (org.joda.time.DateTime)? Это в основном однострочно.

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09

Я предлагаю также передать DateTimeZone, а не назначать текущий часовой пояс JVM по умолчанию для DateTimeобъекта. new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Василий Бурк

7

Похоже, вы ищете SimpleDateFormat .

Формат: гггг-мм-дд кк: мм: сс


"КК" делает что-то особенное? Я думаю, что Эрик хочет это через 24 часа.
Чарли Солтс

2
Да, час в день (1-24), но это, вероятно, не то, что нужно ОП. HH(0-23) встречается чаще.
BalusC

1
@Cahrlie Salts kk идет от 1-24, где HH идет от 0-23, и я, вероятно, немного самонадеянно предполагал, что он хотел 1-24 @BalusC Объект DateFormat, как синтаксический анализ, так и форматы.
pickypg

Я не понимаю актуальность вашего последнего комментария. Мой комментарий был к Чарли.
BalusC

Я привык к форматам .Net, где HH - 24-часовой формат, а hh - am / pm. Отсюда и чесать голову.
Чарли Солтс

5

В одном кадре;)

Чтобы получить дату

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

Чтобы получить время

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

Чтобы узнать дату и время

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

Удачного кодирования :)


1
К вашему сведению, проблемные старые классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormatтеперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и Java 9. См. Руководство Oracle .
Василий Бурк

4
public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}

4

Самый простой способ его использования заключается в следующем:

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

где «гггг-мм-дд'т'чч: мм: сс» - формат даты чтения

выходной: вс 14 апреля 16:11:48 EEST 2013

Примечания: ЧЧ против чч - ЧЧ относится к 24-часовому формату времени - чч относится к 12-часовому формату


Вопрос об обратном обращении.
Вадим

4

Если вам нужно только время с даты, вы можете просто использовать функцию String.

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

Это автоматически сократит временную часть строки и сохранит ее внутри timeString.


Это может сломаться с другой локалью.
Вадим

4

Вот примеры использования нового Java 8 Time API для форматирования устаревшего java.util.Date :

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

Приятно, DateTimeFormatterчто его можно эффективно кэшировать, поскольку он поточно-ориентирован (в отличие от SimpleDateFormat).

Список предопределенных форматов и ссылка на шаблон .

Кредиты:

Как анализировать / форматировать даты с LocalDateTime? (Java 8)

Java8 java.util.Date преобразование в java.time.ZonedDateTime

Мгновенный формат в строку

В чем разница между java 8 ZonedDateTime и OffsetDateTime?


2

Попробуй это,

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

Вывод:

2013-05-14 17:07:21

Для получения дополнительной информации о форматировании даты и времени в Java см. Ссылки ниже.

Справочный центр Oracle

Пример даты и времени в Java


1
public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}

1

Давай попробуем это

public static void main(String args[]) {

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {           
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
    } catch (Exception ex) {
      ex.printStackTrace();
    }
}

Или функция полезности

public String convertDateToString(Date date, String format) {
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try {
        dateStr = df.format(date);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return dateStr;
}

Из даты конвертации в строку в Java


1
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String


1

Вариант одной линии

Эта опция позволяет легко записать фактическую дату в одну строку.

Пожалуйста, обратите внимание, что это использует Calendar.classи SimpleDateFormat, и тогда не логично использовать его в Java8.

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

1
К вашему сведению, ужасно проблемные классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormatтеперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и более поздние версии . Смотрите Учебник по Oracle .
Василий Бурк

1
(1) Ответ неправильный (я только что получил 2019-20-23 09:20:22- месяц 20 ??) (2) Я не вижу, чтобы в ответе было что-то, что еще не отражено в других ответах. (3) Пожалуйста, не учите детей пользоваться давно устаревшим и печально известным хлопотным SimpleDateFormatзанятием. По крайней мере, не в качестве первого варианта. И не без оговорок. Сегодня у нас намного лучше в java.timeсовременном API даты и времени Java и его DateTimeFormatter.
Оле В.В.

Да ... Я сделал ошибку и забыл ее исправить. Я добавил это быстро, и не помню .. извините !! и спасибо за ваши комментарии, ребята
Алехандро Тейшейра Муньос

@ OleV.V. Не у всех есть доступ к данным и времени современной Java ... так что ... Этот ответ также действителен ...
Алехандро Тейшейра Муньос,

1
Спасибо за ваш комментарий. Если вы хотите предоставить ответ для Java 5 или для Java 6 и 7 без каких-либо внешних зависимостей, очень хорошо, это приветствуется, только пожалуйста, четко укажите, что вы делаете. И ваш ответ по-прежнему неверен, вы получите сюрпризы к Новому году.
Оле В.В.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.