Проаналізувати рядок на сьогодні з різним форматом на Java


91

Я хочу , щоб перетворити Stringв Dateв різних форматах.

Наприклад,

Я отримую від користувача,

String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format

Я хочу перетворити це fromDateяк об'єкт "yyyy-MM-dd"формату Date

Як я можу це зробити?


2
Об'єкт Date не має формату, це просто число, що представляє дату. Дата може бути представлена ​​рядком у форматі "рррр-ММ-дд".
user85421

Відповіді:


181

Погляньте на SimpleDateFormat. Код виглядає приблизно так:

SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

try {

    String reformattedStr = myFormat.format(fromUser.parse(inputString));
} catch (ParseException e) {
    e.printStackTrace();
}

1
замість отримання рядкового формату, чи можу я отримати вихід у Dateформаті?
Рейчел

4
@ Рейчел: Звичайно, просто використовуй parseі не продовжуй далі format. parseаналізує рядок на дату.
Майкл Майерс

3
Але parseдає мені date formatяк, Fri Jan 06 00:01:00 EST 2012але це потрібно у 2012-01-06форматі дати
Рейчел

1
@Rachel це тому, що при виклику System.out.println(anyDateObject)за замовчуванням викликається метод toString (), який, як кажуть, друкує у такому форматі, наприклад Fri Jan 06 00:01:00 EST 2012. Вам потрібно замінити його відповідно до ваших потреб.
КНУ

3
FYI, клопітні старі класи часу та часу, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 і Java 9. Див. Підручник Oracle .
Василь Бурк

13

tl; д-р

LocalDate.parse( 
    "19/05/2009" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)

Деталі

Інші відповіді з java.util.Date, java.sql.Dateі SimpleDateFormatв даний час застаріли.

LocalDate

Сучасний спосіб робити дату-час - це робота з класами java.time, зокрема LocalDate. LocalDateКлас являє собою дату тільки значення без часу доби і без часового поясу.

DateTimeFormatter

Щоб проаналізувати або створити рядок, що представляє значення дати та часу, використовуйте DateTimeFormatterклас.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "19/05/2009" , f );

Не пов'язуйте об'єкт дати та часу з рядком, що представляє його значення. Об'єкт дати та часу не має формату , тоді як рядок має. Об'єкт дати-часу, наприклад LocalDate, може генерувати рядок, який представляє його внутрішнє значення, але об'єкт дати-часу та рядок є окремими окремими об'єктами.

Ви можете вказати будь-який власний формат для створення рядка. Або дозвольте java.time виконувати роботу з автоматичної локалізації.

DateTimeFormatter f = 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                     .withLocale( Locale.CANADA_FRENCH ) ;
String output = ld.format( f );

Дамп на консоль.

System.out.println( "ld: " + ld + " | output: " + output );

ld: 19.05.2009 | вихід: 19 травня 2009 р

Дивіться в дії на IdeOne.com .


Про java.time

Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.

Проект Joda-Time , який зараз перебуває в режимі обслуговування , радить перейти на класи java.time .

Щоб дізнатись більше, див. Підручник Oracle . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .

Ви можете обмінювати об'єкти java.time безпосередньо з базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або новішою. Не потрібні рядки, не потрібні java.sql.*класи.

Де отримати класи java.time?

  • Java SE 8 , Java SE 9 та новіші версії
    • Вбудований.
    • Частина стандартного Java API із комплексною реалізацією.
    • Java 9 додає деякі незначні функції та виправлення.
  • Java SE 6 і Java SE 7
    • Значна частина функцій java.time перенесена назад на Java 6 і 7 у ThreeTen-Backport .
  • Android

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


12

Використовуйте SimpleDateFormatклас:

private Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = new SimpleDateFormat(format);
    return formatter.parse(date);
}

Використання:

Date date = parseDate("19/05/2009", "dd/MM/yyyy");

Для ефективності ви хотіли б зберегти свої форматеристики у хеш-капі. Хеш-карта є статичним членом вашого класу util.

private static Map<String, SimpleDateFormat> hashFormatters = new HashMap<String, SimpleDateFormat>();

public static Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = hashFormatters.get(format);

    if (formatter == null)
    {
        formatter = new SimpleDateFormat(format);
        hashFormatters.put(format, formatter);
    }

    return formatter.parse(date);
}

9
КЕВЕЙТ !! Ідея хороша, але реалізація ні. DateFormats не можна зберігати статично, оскільки вони не є безпечними для потоків! Якщо вони використовуються з більш ніж однієї нитки (а це завжди ризиковано із статикою). FindBugs містить детектор для цього (до чого я, здається, спочатку долучився після того, як мене вкусили. Див. Dschneller.blogspot.com/2007/04/… :-))
Даніель Шнеллер,

Запис у вашому блозі - цікаве читання :-) Що робити, якщо сам метод parseDate я синхронізував? Проблема в тому, що це, мабуть, сповільнить роботу коду ...
Агора,

1
Поки метод parseDate був єдиним методом доступу до карти, синхронізація його працювала б. Однак це - як ви кажете - створить вузьке місце.
Даніель Шнеллер

8

Перетворити дату рядка на java.sql.Date

String fromDate = "19/05/2009";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dtt = df.parse(fromDate);
java.sql.Date ds = new java.sql.Date(dtt.getTime());
System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010


3

Хоча SimpleDateFormatсправді буде працювати для ваших потреб, додатково ви можете перевірити Joda Time , який, мабуть, є основою для переробленої бібліотеки дат у Java 7. Хоча я нею користувався багато, я чув нічого, крім хороших речей про це, і якщо ваші маніпулювання датами у ваших проектах, можливо, варто було б розглянути.


1

Простий спосіб форматування дати та перетворення у рядок

    Date date= new Date();

    String dateStr=String.format("%td/%tm/%tY", date,date,date);

    System.out.println("Date with format of dd/mm/dd: "+dateStr);

вихід: Дата з форматом dd / mm / dd: 21.10.2015


1

DateОб'єкт не має неформат , це уявлення. Дата може бути представлена Stringу форматі, який вам подобається .

Наприклад, " yyyy-MM-dd", " yy-MMM-dd", " dd-MMM-yy" та ін.

Щоб досягти цього, ви можете скористатися SimpleDateFormat

Спробуйте це,

        String inputString = "19/05/2009"; // i.e. (dd/MM/yyyy) format

        SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy"); 
        SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type
            String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer
            System.out.println(dateMyFormat); // outputs : 2009-05-19

        } catch (ParseException e) {
            e.printStackTrace();
        }

Результати: 19.05.2009


1

Припустимо, у вас є такий рядок:

String mDate="2019-09-17T10:56:07.827088"

Тепер ми хочемо змінити цей Stringформат окремо для дати та часу в Java та Kotlin .

ЯВА:

у нас є метод для вилучення дати :

public String getDate() {
    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mDate);
        dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Return це: 17.09.2019

І у нас є метод для вилучення часу :

public String getTime() {

    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mCreatedAt);
        dateFormat = new SimpleDateFormat("h:mm a", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Returnце це: 10:56

КОТЛІН:

у нас є функція для дати вилучення :

fun getDate(): String? {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val date = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US)
    return dateFormat.format(date!!)
}

Return це: 17.09.2019

І у нас є метод для вилучення часу :

fun getTime(): String {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val time = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("h:mm a", Locale.US)
    return dateFormat.format(time!!)
}

Returnце це: 10:56


Будь ласка, не вчіть молодих користуватися давно застарілим і, як відомо, неприємним SimpleDateFormatзаняттям. Принаймні не як перший варіант. І не без будь-яких застережень. На сьогоднішній день у нас набагато кращий java.timeсучасний API дати та часу Java та його DateTimeFormatter. Також SimpleDateFormatне вдається правильно проаналізувати 6 десяткових знаків на секунди (мікросекунди).
Оле В. В.

Коли я запускаю ваш другий фрагмент, я не отримую, 10:56 AMяк ви кажете, що повинен, а натомість 11:09 AM(протестовано на Oracle jdk-11.0.3).
Оле В. В.

@ OleV.V. , Якщо метод давно застарів, він буде застарілим із нанесеним на нього рядком як знак, якщо метод чи клас не застаріли, ми можемо використовувати його, я не кажу, що це найкращий спосіб, можливо, у нас є кращий спосіб, але таким чином є простим і зрозумілим, якщо метод або клас були старими, немає жодної причини, що це клопітно, а для використання DateTimeFormatterнам потрібно minsdk 26або вище, ніж це не добре
milad salimi

@ OleV.V. Але дякую за ваш коментар та ваш другий коментар, я можу сказати, що я перевіряю його багато разів у двох додатках, і він повертається10:56 AM
milad salimi

1
@ OleV.V. , Гаразд, але я використовую бібліотеку, коли у мене немає ніякого способу, або цей API (бібліотека) буде дуже і дуже кращим за мій код, тому що, коли ви додаєте бібліотеку, ви додаєте до свого проекту деякі коди, які можуть не використовуватись, і це перевантажує ваш проект, це мій підхід, і ваш підхід для мене поважний.
milad salimi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.