Перетворити java.util.Date в String


407

Я хочу перетворити java.util.Dateоб'єкт Stringв Java.

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



@harschware FYI, проект 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перевірка.
Farrukh Chishti

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 .

Щоб отримати рядок у бажаному форматі, вкажіть a DateTimeFormatter. Ви можете вказати спеціальний формат. Але я б скористався одним із заздалегідь визначених форматів ( ISO_LOCAL_DATE_TIME) і замінив Tу своєму виході SPACE.

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

2014-11-14 14:05:09

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

Також остерігайтеся втрати даних, оскільки будь-яка дробова секунда ігнорується (фактично обрізається) у поданні вашої рядки значення дати та часу.

Щоб побачити той самий момент крізь лінзу настінного годинника певного регіону , застосуйте a, ZoneIdщоб отримати 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 . І шукайте переповнення стека за багатьма прикладами та поясненнями.

Значна частина функцій java.time підтримується на Java 6 і 7 у ThreeTen-Backport і надалі адаптується до Android у ThreeTenABP (див. Як користуватися… ).

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time.


Ось приклади коду форматування з Java 8 Time API: stackoverflow.com/a/43457343/603516
Vadzim

цей код не працює 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за замовчуванням. Я виправив відповідь, дякую. FYI, вони означають те саме:, 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()буде виконуватися виклик типу . Перевірте свої importзаяви. Переконайтеся, що ваш IDE / проект встановлений для запуску Java 8 або новішої версії, а не попередньої версії Java. Дивіться код, запущений наживо на IdeOne.com: ideone.com/2Vm2O5
Василь Бурк

19

Альтернативні одноводки в звичайній старій яві:

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);

Для цього використовується Форматтер та відносна індексація, замість SimpleDateFormatякої не безпечно для потоків , btw.

Трохи повторювані, але потрібно лише одне твердження. Це може бути корисно в деяких випадках.


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, а не призначити DateTimeоб'єкту поточний часовий пояс JVM . new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Василь Бурк

7

Схоже, ви шукаєте SimpleDateFormat .

Формат: yyyy-MM-dd kk: mm: ss


Чи робить "кк" щось особливе? Я думаю, Ерік хоче цього через 24 години.
Charlie Salts

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. Звідси вичісування голови.
Charlie Salts

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
FYI, тривожні старі класи дату, такі як 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");

де "yyyy-MM-dd'T'HH: mm: ss" - формат дати читання

вихід: Пн 14 квітня 16:11:48 EEST 2013

Примітки: HH vs hh - HH відноситься до 24-годинного формату часу - hh означає 12-часовий формат часу


Питання полягає в протилежному перетворенні.
Вадим

4

Якщо вам потрібен лише час від дати, ви можете просто скористатися функцією String.

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

Це автоматично скоротить часову частину рядка і збереже її всередині timeString.


Це може порушитися з різною локальністю.
Вадим

4

Ось приклади використання нового Java 8 API 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
Date date = new Date();
String strDate = String.format("%tY-%<tm-%<td %<tH:%<tM:%<tS", date);

1

Варіант однієї лінії

Цей параметр отримує простий однорядковий запис фактичної дати.

Зверніть увагу, що це використовується Calendar.classі SimpleDateFormat, і тоді це не логічно використовувати в Java8.

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

1
FYI, жахливі класи, які датують час, такі як 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.