Format daty Java - w tym dodatkowe znaki

88

Czy istnieje odpowiednik formatowania stylu php date () w Javie? Chodzi mi o to, że w php mogę znaki ucieczki odwrotnym ukośnikiem, aby były traktowane dosłownie. To znaczy rrrr \ y \ e \ a \ r będzie rokiem 2010 . Nie znalazłem czegoś podobnego w Javie, wszystkie przykłady dotyczą tylko wbudowanych formatów daty.

W szczególności mam do czynienia z selektorami dat JCalendar i ich właściwością dateFormatString .

Potrzebuję tego, ponieważ w moich ustawieniach regionalnych wymagane jest pisanie różnego rodzaju dodatkowych rzeczy w formacie daty, takich jak d. (na dzień) część dniowa, m. (przez lata) po latach i tak dalej. W najgorszym przypadku mógłbym użyć zamiany napisów lub wyrażenia regularnego, ale może jest prostszy sposób? Z góry dziękuję!

Sejanus
źródło
1
Dla każdego, kto czyta to w 2019 roku lub później, SimpleDateFormatklasa użyta w kilku odpowiedziach jest notorycznie kłopotliwa i od dawna nieaktualna. Unikaj tego. Zamiast tego skorzystaj z krótkiej odpowiedzi Marka Jeronimusa, demonstrującej użycie java.time, nowoczesnego API daty i czasu Java .
Ole VV

Odpowiedzi:

164

Jasne, dzięki SimpleDateFormat możesz dołączyć ciągi literałów:

W ciągach wzorców daty i czasu niecytowane litery od „A” do „Z” i od „a” do „z” są interpretowane jako litery wzorca reprezentujące składniki ciągu daty lub godziny. Aby uniknąć interpretacji, tekst można cytować za pomocą apostrofów ('). „''” reprezentuje pojedynczy cytat. Wszystkie inne znaki nie są interpretowane; są po prostu kopiowane do ciągu wyjściowego podczas formatowania lub dopasowywane do ciągu wejściowego podczas analizowania.

 "hh 'o''clock' a, zzzz"    12 o'clock PM, Pacific Daylight Time
Thilo
źródło
Super, dokładnie tego potrzebuję. O dziwo nie znalazłem takiej prostej rzeczy w żadnym z wielu przykładów, które przeglądałem w sieci :) Wielkie dzięki!
Sejanus
1
Jak uniknąć cudzysłowu? Próbuję coś zrobić z formatem mm '. Wskazuje na przykład 46 minut, na przykład 46 minut.
Sotti
3
@Sotti: 46''. Pierwszy, który uciekł przed drugim.
Thilo
1
FYI, strasznie kłopotliwe klasy daty i czasu, takie jak java.util.Date, java.util.Calendari java.text.SimpleDateFormatsą teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze.
Basil Bourque
24

Dla kompletności Java 8 DateTimeFormatterobsługuje również to:

DateTimeFormatter.ofPattern("yyyy 'year'");
Mark Jeronimus
źródło
6

Możesz użyć String.format zgodnie z dokumentacją w java.util.Formatter :

Calendar c = ...;
String s = String.format("%tY year", c);
// -> s == "2010 year" or whatever the year actually is
R Samuel Klatchko
źródło
5

java.time

Mark Jeronimus już to powiedział . Rozwijam to trochę bardziej. Po prostu umieść tekst do wydrukowania dosłownie w pojedynczych cudzysłowach.

    DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy 'year'");
    System.out.println(LocalDate.of(2010, Month.FEBRUARY, 3).format(yearFormatter));
    System.out.println(Year.of(2010).format(yearFormatter));
    System.out.println(ZonedDateTime.now(ZoneId.of("Europe/Vilnius")).format(yearFormatter));

Wyjście podczas pracy przed chwilą:

2010 year
2010 year
2019 year

Jeśli używasz a DateTimeFormatterBuilderi jej appendPatternmetody, użyj apostrofów w ten sam sposób. Lub użyj appendLiteralzamiast tego jego metody i bez cudzysłowów.

Jak więc umieścimy pojedynczy cytat w formacie? Dwa pojedyncze cudzysłowy dają jeden. Nie ma znaczenia, czy podwójny pojedynczy cudzysłów znajduje się w pojedynczych cudzysłowach, czy nie:

    DateTimeFormatter formatterWithSingleQuote = DateTimeFormatter.ofPattern("H mm'' ss\"");
    System.out.println(LocalTime.now(ZoneId.of("Europe/London")).format(formatterWithSingleQuote));

10 28 '34 "

    DateTimeFormatter formatterWithSingleQuoteInsideSingleQuotes
            = DateTimeFormatter.ofPattern("hh 'o''clock' a, zzzz", Locale.ENGLISH);
    System.out.println(ZonedDateTime.now(ZoneId.of("America/Los_Angeles"))
            .format(formatterWithSingleQuoteInsideSingleQuotes));

Godzina 02:00 czasu pacyficznego letniego

Wszystkie powyższe elementy formatujące mogą być również używane do analizowania. Na przykład:

    LocalTime time = LocalTime.parse("16 43' 56\"", formatterWithSingleQuote);
    System.out.println(time);

16:43:56

SimpleDateFormatKlasa używana gdy pytano prawie 10 lat temu, jest notorycznie kłopotliwe i długo nieaktualne. Zalecam zamiast tego używać java.time, nowoczesnego API daty i czasu w Javie. Dlatego właśnie to pokazuję.

Spinki do mankietów

Ole VV
źródło
-4

java.text.SimpleDateFormat

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); 
String formattedDate = formatter.format(date);

Więcej informacji uzyskasz tutaj tekst linku

Javi
źródło