Jak sformatować Joda-Time DateTime tylko na mm / dd / rrrr?

189

Mam ciąg „ 11/15/2013 08:00:00”, chcę sformatować go na „ 11/15/2013”, jaki jest prawidłowy DateTimeFormatterwzór?

Próbowałem wielu i przejrzałem Google i wciąż nie mogę znaleźć prawidłowego wzoru.

edycja: Szukam Joda-Time DateTimeFormatter , a nie Java SimpleDateFormat ..

iCodeLikeImDrunk
źródło
2
tl; dr: DateTimeFormat.forPattern („MM / dd / rrrr GG: mm: ss”). print (DateTime.now ())
Andrew

Odpowiedzi:

386

Czas Jody

Utwórz za DateTimeFormatterpomocąDateTimeFormat.forPattern(String)

Wykorzystując czas Jody, zrobiłbyś to w następujący sposób:

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

Standardowa Java ≥ 8

Java 8 wprowadziła nową bibliotekę daty i godziny , która ułatwia zarządzanie datami i godzinami. Jeśli chcesz używać standardowej wersji Java 8 lub nowszej, użyj DateTimeFormatter . Ponieważ nie masz w sobie strefy czasowej String, java.time.LocalDateTime lub LocalDate , w przeciwnym razie można zastosować odmiany strefowe ZonedDateTime i 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));

Standardowa Java <8

W wersjach wcześniejszych niż Java 8 należy używać SimpleDateFormat i 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));
DeltaLima
źródło
7
przepraszam, ale szukam DateTimeFormatter jodatime.
iCodeLikeImDrunk
1
@yaojiang Joda używa tej samej składni formatu co SimpleDateFormat. Przeczytaj dokumentację API.
Jesper
@yaojiang Jak wspomniał Jesper, Joda używa tych samych ciągów formatujących, chociaż ma więcej opcji. Rozszerzyłem przykład o Jodę, jak widać, jest bardzo podobny.
DeltaLima,
dziwnie używam DateTimeFormatter dtf = DateTimeFormat.forPattern („MM / dd / rrrr”); i nadal dostaję „mm / dd / rrrr gg: mm: ss” ...
iCodeLikeImDrunk
2
Podczas gdy Joda-Time używa bardzo podobnych kodów formatowania jak java.util.Date/Calendar, należy uważnie przeczytać dokument w celu uzyskania subtelnych różnic. Nie są identyczne.
Basil Bourque
45

Dodaję to tutaj, mimo że inne odpowiedzi są całkowicie do przyjęcia. JodaTime ma parsery wstępnie wbudowane w DateTimeFormat:

dateTime.toString(DateTimeFormat.longDate());

Oto większość opcji wydrukowanych wraz z ich formatem:

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
Chad Bingham
źródło
1
fajnie, jakiś pomysł, jaką wersję to wprowadzono? zaoszczędzić dużo czasu, nie tworząc głupich ciągów formatu ...
iCodeLikeImDrunk
Tak, całkowicie się zgadzam. Wygląda na to, że zawsze tam był. joda-time.sourceforge.net/apidocs/org/joda/time/format/…
Chad Bingham
21
DateTime date = DateTime.now().withTimeAtStartOfDay();
date.toString("HH:mm:ss")
sebastian krüger
źródło
1
Jest to przydatne, choć nie odpowiada dokładnie na pytanie. Wersja DateTime.now().toString("HH:mm:ss")
jednowierszowa
11

Myślę, że to zadziała, jeśli używasz 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);

Dostałem część tego stąd .

Facet z kapeluszem
źródło
Twój link do dokumentacji jest nieaktualny. Prawidłowy adres URL to: joda.org/joda-time/apidocs/org/joda/time/format/…
Basil Bourque
1
@BasilBourque Dziękuję za wskazanie, że Djest to dzień roku, ale mój „link do dokumentacji” nie jest nieaktualny: dokumentacja, z którą się łączyłem, jest nieaktualna. Nie łączyłem się z dokumentacją dla samego siebie, prowadziłem do strony, z której otrzymałem trochę kodu, który okazuje się być nieaktualną dokumentacją.
Facet z kapeluszem
10

Mam bardzo głupią, ale działającą opcję. jeśli masz ciąg fullDate = "11/15/2013 08:00:00";

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

To powinno działać szybko i łatwo. :)

Odziany Odziany
źródło
tak, na pewno zmienię format. to działa, ale tylko w tym przypadku.
iCodeLikeImDrunk
1
Niezupełnie oczekiwane zachowanie, potem nikt (w tym ty), który wygląda na twój kod, nic nie rozumie, co tu zrobiłeś ...
Sercan Ozdemir
3

AKTUALIZACJA:

Możesz: stworzyć stałą:

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

Ten DateTimeFormat importuje z: (bądź ostrożny z tym)

import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter;

Analizuj datę za pomocą:

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

Przed:
DateTime.parse („201711201515”, DateTimeFormat.forPattern („rrrrMMddGGmm”)). ToString („rrrrMMdd”);

jeśli chcesz datetime:

DateTime.parse("201711201515", DateTimeFormat.forPattern("yyyyMMddHHmm")).withTimeAtStartOfDay();
Jacky.cheng
źródło
2

To działa

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();
}
Eddie
źródło
1

Innym sposobem na to jest:

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

Nie jestem do końca pewien, ale myślę, że może to być szybsze / zużywa mniej pamięci niż przy użyciu tej .split()metody.

Facet z kapeluszem
źródło