Як відформатувати Joda-Time DateTime лише до мм / дд / рррр?


189

У мене є рядок " 11/15/2013 08:00:00", я хочу відформатувати його до " 11/15/2013", що є правильним DateTimeFormatterшаблоном?

Я багато пробував і гугл, і досі не в змозі знайти правильну схему.

редагувати: Шукаю Joda-Time DateTimeFormatter , а не SimpleDateFormat Java ..


2
tl; dr: DateTimeFormat.forPattern ("MM / dd / yyyy HH: mm: ss"). print (DateTime.now ())
Ендрю

Відповіді:


386

Час джода

Створіть за DateTimeFormatterдопомогоюDateTimeFormat.forPattern(String)

Використовуючи час Joda, ви зробите це так:

String dateTime = "11/15/2013 08:00:00";
// Format for input
DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
// Parsing the date
DateTime jodatime = dtf.parseDateTime(dateTime);
// Format for output
DateTimeFormatter dtfOut = DateTimeFormat.forPattern("MM/dd/yyyy");
// Printing the date
System.out.println(dtfOut.print(jodatime));

Стандартна Java ≥ 8

Java 8 представила нову бібліотеку дати та часу , що полегшує роботу з датами та часом. Якщо ви хочете використовувати стандартну версію Java 8 або вище, ви використовуєте DateTimeFormatter . Оскільки у вас немає часового поясу String, java.time.LocalDateTime або LocalDate , інакше можуть бути використані часові зони сортування ZonedDateTime та ZonedDate .

// Format for input
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
// Parsing the date
LocalDate date = LocalDate.parse(dateTime, inputFormat);
// Format for output
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy");
// Printing the date
System.out.println(date.format(outputFormat));

Стандартна Java <8

Перед Java 8 ви б використовували SimpleDateFormat та java.util.Date

String dateTime = "11/15/2013 08:00:00";
// Format for input
SimpleDateFormat dateParser = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
// Parsing the date
Date date7 = dateParser.parse(dateTime);
// Format for output
SimpleDateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy");
// Printing the date
System.out.println(dateFormatter.format(date7));

7
вибачте, але я шукаю jodatime's DateTimeFormatter.
iCodeLikeImDrunk

1
@yaojiang Joda використовує той самий синтаксис рядка формату, що і SimpleDateFormat. Прочитайте документацію API.
Jesper

@yaojiang Як ​​згадував Jesper, Joda використовує ті самі рядки форматування, хоча має більше варіантів. Я розширив приклад, щоб включити Джоду, як ви бачите, він дуже схожий.
DeltaLima

як не дивно, я використовую DateTimeFormatter dtf = DateTimeFormat.forPattern ("MM / dd / yyyy"); і я все ще отримую "мм / дд / рр. год. год .: мм: сс" ...
iCodeLikeImDrunk

2
У той час як Joda-Time використовує дуже подібні коди форматування, як java.util.Date/Calendar, уважно прочитайте документ для тонких відмінностей. Вони не тотожні.
Василь Бурк

45

Я додаю це сюди, хоча інші відповіді цілком прийнятні. JodaTime має вбудовані в DataTimeFormat парсери:

dateTime.toString(DateTimeFormat.longDate());

Це більшість варіантів, роздрукованих із їх форматом:

shortDate:         11/3/16
shortDateTime:     11/3/16 4:25 AM
mediumDate:        Nov 3, 2016
mediumDateTime:    Nov 3, 2016 4:25:35 AM
longDate:          November 3, 2016
longDateTime:      November 3, 2016 4:25:35 AM MDT
fullDate:          Thursday, November 3, 2016
fullDateTime:      Thursday, November 3, 2016 4:25:35 AM Mountain Daylight Time

1
приємно, будь-яка ідея, в яку версію це було введено? економте багато часу, не створюючи дурних рядків формату ...
iCodeLikeImDrunk

Так, я повністю згоден. Схоже, він завжди був там. joda-time.sourceforge.net/apidocs/org/joda/time/format/…
Чад Бінгем


11

Я думаю, що це спрацює, якщо ви використовуєте JodaTime:

String strDateTime = "11/15/2013 08:00:00";
DateTime dateTime = DateTime.parse(strDateTime);
DateTimeFormatter fmt = DateTimeFormat.forPattern("MM/dd/YYYY");
String strDateOnly = fmt.print(dateTime);

Я отримав частину цього звідси .


Посилання на документацію застаріло. Правильна URL-адреса: joda.org/joda-time/apidocs/org/joda/time/format/…
Василь Бурк

1
@BasilBourque Дякую, що вказав, що Dце день року, але моя "посилання на документацію" не застаріла: документація, до якої я посилався , застаріла. Я не посилався на документацію заради себе, я посилався на сторінку, від якої я отримав якийсь код - що, як правило, застаріла документація.
Хлопець з капелюхом

10

У мене дуже тупий, але робочий варіант. якщо у вас є String fullDate = "15.11.2013 08:00:00";

   String finalDate = fullDate.split(" ")[0];

Це повинно працювати легко і швидко. :)


так, я обов'язково буду змінювати формат навколо. це працює, але лише для цього випадку.
iCodeLikeImDrunk

1
Насправді не очікувана поведінка, після цього ніхто (включаючи вас), хто дивиться ваш код, нічого не розуміє, що ви тут робили ...
Sercan Ozdemir

3

ОНОВЛЕНО:

Ви можете: створити константу:

private static final DateTimeFormatter DATE_FORMATTER_YYYY_MM_DD =
          DateTimeFormat.forPattern("yyyy-MM-dd"); // or whatever pattern that you need.

Цей DateTimeFormat імпортується з: (будьте обережні)

імпортувати org.joda.time.format.DateTimeFormat; імпортувати org.joda.time.format.DateTimeFormatter;

Розберіть дату за допомогою:

DateTime.parse(dateTimeScheduled.toString(), DATE_FORMATTER_YYYY_MM_DD);

До:
DateTime.parse ("201711201515", DateTimeFormat.forPattern ("yyyyMMddHHmm")). ToString ("yyyyMMdd");

якщо хочете дати:

DateTime.parse("201711201515", DateTimeFormat.forPattern("yyyyMMddHHmm")).withTimeAtStartOfDay();

2

Це працює

String x = "22/06/2012";
String y = "25/10/2014";

String datestart = x;
String datestop = y;

//DateTimeFormatter format = DateTimeFormat.forPattern("dd/mm/yyyy");
SimpleDateFormat  format = new SimpleDateFormat("dd/mm/yyyy");

Date d1 = null;
Date d2 = null;

try {
    d1 =  format.parse(datestart);
    d2 = format.parse(datestop);

    DateTime dt1 = new DateTime(d1);
    DateTime dt2 = new DateTime(d2);

    //Period
    period = new Period (dt1,dt2);

    //calculate days
    int days = Days.daysBetween(dt1, dt2).getDays();


} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

1

Ще один спосіб зробити це:

String date = dateAndTime.substring(0, dateAndTime.indexOf(" "));

Я точно не впевнений, але думаю, що це може бути швидше / використовувати менше пам'яті, ніж використовувати .split()метод.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.