JavaRush /Blog Java /Random-PL /Jak nie zgubić się w czasie - DateTime i Kalendarz

Jak nie zgubić się w czasie - DateTime i Kalendarz

Opublikowano w grupie Random-PL
Cześć! Dzisiaj zaczniemy pracę z nowym typem danych, z którym wcześniej się nie spotkaliśmy, a mianowicie datami. Jak nie zgubić się w czasie - DateTime i Calendar - 1Myślę, że nie trzeba wyjaśniać, czym jest data :) W zasadzie całkiem możliwe jest zapisanie aktualnej daty i godziny w Javie w zwykłym ciągu znaków.
public class Main {
   public static void main(String[] args) {

       String date = „11 czerwca 2018”;
       System.out.println(date);
   }
}
Ale to podejście ma wiele wad. Klasa Stringzostała stworzona do pracy z tekstem i posiada odpowiednie metody. Jeśli trzeba jakoś zagospodarować datę (dodać do niej np. 2 godziny) to Stringtutaj się to nie sprawdzi. Lub na przykład wyświetl bieżącą datę i godzinę w momencie kompilacji programu do konsoli. Tutaj Stringteż to nie pomoże: podczas pisania kodu i uruchamiania go czas się zmieni, a w konsoli wyświetli się to, co nieistotne. Dlatego w Javie jej twórcy udostępnili kilka klas do pracy z datami i godzinami. Pierwsza to klasajava.util.Date

Klasa daty Java

Nadaliśmy jej pełną nazwę, ponieważ w Javie istnieje również klasa w innym pakiecie java.sql.Date. Nie daj się zwieść! Pierwszą rzeczą, którą musisz o nim wiedzieć, jest to, że przechowuje datę w milisekundach , która minęła od 1 stycznia 1970 roku. Istnieje nawet osobna nazwa tej daty – „Czas uniksowy”. Całkiem ciekawy sposób, prawda? :) Druga rzecz do zapamiętania: jeśli utworzysz obiekt Datez pustym konstruktorem, wynikiem będzie aktualna data i godzina w momencie utworzenia obiektu . StringPamiętacie jak pisaliśmy, że takie zadanie byłoby problematyczne dla formatu daty ? Klasa Daterozwiązuje to łatwo.
public class Main {
   public static void main(String[] args) {

       Date date = new Date();
       System.out.println(date);
   }
}
Uruchom ten kod kilka razy, a zobaczysz, jak czas będzie się zmieniać za każdym razem :) Jest to możliwe właśnie dlatego, że jest on przechowywany w milisekundach: są to najmniejsza jednostka czasu, dlatego wyniki są tak dokładne. Istnieje inny konstruktor Date: możesz określić dokładną liczbę milisekund, które upłynęły od 00:00 1 stycznia 1970 do wymaganej daty, a zostanie ona utworzona:
public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
Wyjście konsoli:

Fri May 30 08:20:12 MSD 2008
Otrzymaliśmy go 30 maja 2008 roku. „Piątek” oznacza dzień tygodnia - „piątek” (piątek), a MSD - „Moskiewski czas letni” (moskiewski czas letni). Milisekundy przesyłane są w formacie long, ponieważ ich liczba najczęściej nie mieści się w formacie int. Jakiego rodzaju operacje na datach możemy zatem potrzebować w naszej pracy? Cóż, najbardziej oczywistą rzeczą jest oczywiście porównanie . Określ, czy jedna data była późniejsza, czy wcześniejsza od drugiej. Można to zrobić na różne sposoby. Można na przykład wywołać metodę . Date.getTime(), która zwróci liczbę milisekund, które upłynęły od północy 1 stycznia 1970 roku. Po prostu wywołajmy to na dwóch obiektach Date i porównajmy je ze sobą:
public class Main {
   public static void main(String[] args) {

       Date date1 = new Date();

       Date date2 = new Date();

       System.out.println((date1.getTime() > date2.getTime())?
               „data1 jest późniejsza niż data2” : „data1 jest wcześniejsza niż data2”);
   }
}
Wniosek:

date1 раньше date2
Istnieje jednak wygodniejszy sposób, a mianowicie użycie specjalnych metod klasy Date: before(), after()i equals(). Wszystkie zwracają wynik w formacie boolean. Metoda before()sprawdza, czy nasza data jest wcześniejsza od tej, którą przekazujemy jako argument:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//wstrzymaj program na 2 sekundy
       Date date2 = new Date();

       System.out.println(date1.before(date2));
   }
}
Wyjście konsoli:

true
Metoda działa podobnie after(), sprawdza, czy nasza data była późniejsza od tej, którą podajemy jako argument:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//wstrzymaj program na 2 sekundy
       Date date2 = new Date();

       System.out.println(date1.after(date2));
   }
}
Wyjście konsoli:

false
W naszych przykładach uśpiliśmy program na 2 sekundy, aby mieć pewność, że obie daty będą różne. Na szybkich komputerach czas między utworzeniem date1i date2może być krótszy niż jedna milisekunda, w takim przypadku oba i before()i after()powrócą false. Ale metoda equals()w takiej sytuacji powróci true! Przecież dla każdej daty porównuje dokładnie liczbę milisekund, które upłynęły od 00:00 1 stycznia 1970 roku. Obiekty zostaną uznane za równe tylko wtedy, gdy będą zgodne co do milisekundy:
public static void main(String[] args) {

   Date date1 = new Date();
   Date date2 = new Date();

   System.out.println(date1.getTime());
   System.out.println(date2.getTime());

   System.out.println(date1.equals(date2));
}
Tutaj jest jeszcze coś, na co musisz zwrócić uwagę. Jeśli otworzysz dokumentację klasy Datew witrynie Oracle, zobaczysz, że wiele jej metod i konstruktorów zostało oznaczonych jako Deprecated(„przestarzałe”). Tutaj spójrz: Class Date Oto, co sami twórcy Java mówią o tych częściach klas, które stały się przestarzałe: „Element programu z adnotacją @Deprecated to coś, czego programiści nie powinni używać, zwykle dlatego, że jest niebezpieczny lub dlatego, że istnieje lepsza alternatywa.” Nie oznacza to jednak, że metod tych nie można w ogóle zastosować. Co więcej, jeśli sam spróbujesz uruchomić kod wykorzystując je w IDEA, najprawdopodobniej się to uda.Weźmy dla przykładu przestarzałą metodę Date.getHours(), która zwraca liczbę godzin z obiektu Date.
public static void main(String[] args) {

   Date date1 = new Date();

   System.out.println(date1.getHours());

}
Jeśli w momencie uruchomienia kodu jest na przykład godzina 14:21, wyświetli się liczba 14. Jak widać, przestarzała metoda jest przekreślona, ​​ale działa całkiem nieźle. Metody te nie zostały całkowicie usunięte, aby nie uszkodzić kodu już napisanego przy ich użyciu. Oznacza to, że metody te nie są „zepsute” ani „usunięte”, po prostu nie są zalecane do stosowania ze względu na dostępność wygodniejszej alternatywy. Swoją drogą jest o tym napisane bezpośrednio w dokumentacji: Jak nie zgubić się w czasie - DateTime i Calendar - 2Większość metod klasy Date została przeniesiona do jej ulepszonej, rozszerzonej wersji – klasy Calendar. Poznamy go bliżej :)

Kalendarz Java

Java 1.1 wprowadziła nową klasę - Calendar. Dzięki niemu praca z datami w Javie stała się nieco łatwiejsza niż wcześniej. Jedyną implementacją klasy, Calendarz którą będziemy pracować, jest klasa GregorianCalendar(implementuje kalendarz gregoriański, według którego żyje większość krajów świata). Jego główną wygodą jest to, że może pracować z datami w wygodniejszym formacie. Może na przykład:
  • Dodaj miesiąc lub dzień do bieżącej daty
  • Sprawdź, czy dany rok jest rokiem przestępnym;
  • Uzyskaj poszczególne składniki daty (na przykład uzyskaj numer miesiąca z całej daty)
  • Opracowano w nim także bardzo wygodny system stałych (wiele z nich zobaczymy poniżej).
Kolejną ważną różnicą tej klasy Calendarjest to, że implementuje stałą Calendar.Era: można ustawić datę na erę BC („Przed Chrystusem” - przed narodzinami Chrystusa, tj. „Przed naszą erą”) lub AC („Po Chrystusie” - „ nasza era”). Spójrzmy na to wszystko na przykładach. Utwórzmy kalendarz z datą 25 stycznia 2017 r.:
public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
Miesiące w klasie Calendar(swoją Datedrogą) zaczynają się od zera, dlatego jako drugi argument przekazaliśmy liczbę 0. Najważniejsze podczas pracy z klasą Calendarjest zrozumienie, że jest to kalendarz , a nie osobna data. Jak nie zgubić się w czasie - DateTime i Calendar - 3Data to po prostu ciąg liczb reprezentujących określony okres czasu. A kalendarz to całe urządzenie, za pomocą którego można wiele rzeczy zrobić z datami :) Można to dość wyraźnie zobaczyć, jeśli spróbujesz wyprowadzić obiekt Kalendarz na konsolę: Dane wyjściowe:

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=2017,MONTH=0,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Zobacz, ile jest informacji! Kalendarz ma wiele właściwości, których nie ma zwykła data, i wszystkie z nich są wyprowadzane do konsoli (tak działa metoda toString()w tej klasie Calendar). Jeśli w pracy potrzebujesz po prostu prostej daty z kalendarza, czyli np. obiekt Date- odbywa się to za pomocą metody Calendar.getTime()(nazwa nie jest najbardziej logiczna, ale nic nie da się zrobić):
public static void main(String[] args) {

   Calendar calendar = new GregorianCalendar(2017, 0 , 25);
   Date date = calendar.getTime();
   System.out.println(date);
}
Wniosek:

Wed Jan 25 00:00:00 MSK 2017
Teraz „uprościliśmy” kalendarz do zwykłej daty. Przejdźmy dalej. Oprócz symboli liczbowych oznaczających miesiące, Calendarw klasie można używać stałych. Stałe to statyczne pola klasy Calendarz już ustawioną wartością, której nie można zmienić. Ta opcja jest w rzeczywistości lepsza, ponieważ poprawia czytelność kodu.
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Calendar.JANUARY— jedna ze stałych wskazujących miesiąc. Dzięki tej opcji nazewnictwa nikt nie zapomni na przykład, że cyfra „3” oznacza kwiecień, a nie trzeci miesiąc, do którego jesteśmy przyzwyczajeni - marzec. Po prostu piszesz Calendar.APRIL- i tyle :) Wszystkie pola kalendarza (dzień, miesiąc, minuty, sekundy itp.) można ustawić indywidualnie metodą set(). Jest to bardzo wygodne, ponieważ Calendarkażde pole ma w klasie swoją stałą, a końcowy kod będzie wyglądał tak prosto, jak to tylko możliwe. Przykładowo w poprzednim przykładzie utworzyliśmy datę, ale nie ustawiliśmy dla niej aktualnej godziny. Ustawmy godzinę na 19:42:12
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar();
   calendar.set(Calendar.YEAR, 2017);
   calendar.set(Calendar.MONTH, 0);
   calendar.set(Calendar.DAY_OF_MONTH, 25);
   calendar.set(Calendar.HOUR_OF_DAY, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println(calendar.getTime());
}
Wniosek:

Wed Jan 25 19:42:12 MSK 2017
Wywołujemy metodę set(), przekazujemy do niej stałą (w zależności od pola, które chcemy zmienić) i nową wartość dla tego pola. Okazuje się, że metoda set()jest swego rodzaju „super-setterem”, który może ustawić wartość nie dla jednego pola, ale dla wielu pól :) Dodawanie i odejmowanie wartości w klasie Calendarodbywa się za pomocą metody add(). Musisz przekazać do niego pole, które chcesz zmienić, oraz liczbę - dokładnie, ile chcesz dodać/odjąć od aktualnej wartości. Na przykład ustawmy datę, którą utworzyliśmy, z powrotem na 2 miesiące temu:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.add(Calendar.MONTH, -2);//aby odjąć wartość - do metody należy przekazać liczbę ujemną
   System.out.println(calendar.getTime());
}
Wniosek:

Fri Nov 25 19:42:12 MSK 2016
Świetnie! Ustaliliśmy datę z powrotem na 2 miesiące temu. W rezultacie zmienił się nie tylko miesiąc, ale także rok, z 2017 na 2016. Obliczanie bieżącego roku przy przesuwaniu dat odbywa się oczywiście automatycznie i nie trzeba nim sterować ręcznie. Ale jeśli z jakiegoś powodu musisz wyłączyć to zachowanie, możesz to zrobić. Specjalna metoda roll()umożliwia dodawanie i odejmowanie wartości bez wpływu na inne wartości. Na przykład tak:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(calendar.getTime());
}
Zrobiliśmy dokładnie to samo co w poprzednim przykładzie - od aktualnej daty odjęliśmy 2 miesiące. Ale teraz kod działał inaczej: miesiąc zmienił się ze stycznia na listopad, ale rok pozostał taki sam jak 2017! Wniosek:

Sat Nov 25 10:42:12 MSK 2017
Dalej. Jak powiedzieliśmy powyżej, wszystkie pola obiektu Calendarmożna uzyskać osobno. Odpowiada za to metoda get():
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println("Rok: " + calendar.get(Calendar.YEAR));
   System.out.println("Miesiąc: " + calendar.get(Calendar.MONTH));
   System.out.println("Numer tygodnia w miesiącu: " + calendar.get(Calendar.WEEK_OF_MONTH));// kolejny numer tygodnia w miesiącu

   System.out.println("Numer: " + calendar.get(Calendar.DAY_OF_MONTH));

   System.out.println("Oglądać: " + calendar.get(Calendar.HOUR));
   System.out.println("Minuty: " + calendar.get(Calendar.MINUTE));
   System.out.println("Sekundy: " + calendar.get(Calendar.SECOND));
   System.out.println(„Milisekundy:” + calendar.get(Calendar.MILLISECOND));

}
Wniosek:

Год: 2017 
Месяц: 0 
Порядковый номер недели в месяце: 4 
Число: 25 
Часы: 10 
Минуты: 42 
Секунды: 12 
Миллисекунды: 0
Oznacza to, że oprócz „super-settera” w klasie Calendarjest także „super-gettera” :) Kolejnym interesującym punktem jest oczywiście praca z wymazami. Aby utworzyć datę „BC” należy skorzystać z pola Calendar.Era Przykładowo utwórzmy datę wskazującą bitwę pod Kannami, w której Hannibal pokonał armię Rzymu. Stało się to 2 sierpnia 216 roku p.n.e. mi.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
Tutaj wykorzystaliśmy klasę SimpleDateFormatdo wyświetlenia daty w bardziej dla nas zrozumiałej formie (za wyświetlenie ery odpowiadają litery „GG”). Wniosek:

02 авг 216 до н.э.
W klasie Calendarjest znacznie więcej metod i stałych , przeczytaj o nich w dokumentacji:

Nowa linia do tej pory

Aby przekonwertować String na Date, możesz użyć klasy pomocniczej Java - SimpleDateFormat . Jest to klasa potrzebna do przekonwertowania daty na zdefiniowany przez Ciebie format. Jak nie zgubić się w czasie - DateTime i Calendar - 5Z kolei jest bardzo podobny do DateFormat . Jedyna zauważalna różnica między nimi polega na tym, że SimpleDateFormat można używać do formatowania (konwertowania daty na ciąg znaków) i analizowania ciągu znaków na datę uwzględniającą ustawienia regionalne, podczas gdy DateFormat nie obsługuje ustawień regionalnych. Ponadto DateFormat to klasa abstrakcyjna, która zapewnia podstawową obsługę formatowania i analizowania dat, natomiast SimpleDateFormat to konkretna klasa, która rozszerza klasę DateFormat. Tak wygląda przykład tworzenia obiektu SimpleDateFormat i formatowania daty:
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);

System.out.println(formatter.format(date));
W powyższym przykładzie użyliśmy wzoru „yyyy-MM-dd HH:mm:ss”, co oznacza:
  • 4 cyfry roku (rrrr);
  • 2 cyfry oznaczające miesiąc (MM);
  • 2 cyfry oznaczające dzień (dd);
  • 2 cyfry godzin w formacie 24-godzinnym (HH);
  • 2 cyfry minut (mm);
  • 2 cyfry oznaczające sekundy (ss).
Znaki separacji i kolejność symboli wzoru zostają zachowane. Wyjście konsoli:
2008-05-30 08:20:12
Istnieje całkiem sporo listów szablonowych dla klasy SimpleDateFormat . Aby się nie pomylić, zebraliśmy je w tabeli:
Symbol Opis Przykład
G era (w lokalizacji angielskiej - AD i BC) OGŁOSZENIE
y rok (liczba 4-cyfrowa) 2020
yy rok (ostatnie 2 cyfry) 20
yyyy rok (liczba 4-cyfrowa) 2020
M numer miesiąca (bez zer wiodących) 8
MM numer miesiąca (z zerami na początku, jeśli numer miesiąca jest < 10) 04
MMM trzyliterowy skrót miesiąca (w zależności od lokalizacji) styczeń
MMMM pełna nazwa miesiąca Czerwiec
w tydzień roku (bez zer wiodących) 4
w W tydzień roku (z zerami wiodącymi) 04
W tydzień w miesiącu (bez zer wiodących) 3
W W tydzień w miesiącu (z zerem wiodącym) 03
D dzień roku 67
D dzień miesiąca (bez zer wiodących) 9
dd dzień miesiąca (z zerami wiodącymi) 09
F dzień tygodnia w miesiącu (bez zer wiodących) 9
FF dzień tygodnia w miesiącu (z zerami wiodącymi) 09
mi dzień tygodnia (skrót) W
EEEE dzień tygodnia (pełny) Piątek
ty numer dnia tygodnia (bez zer wiodących) 5
uu numer dnia tygodnia (z zerami na początku) 05
A Znacznik AM/PM JESTEM.
H godziny w formacie 24-godzinnym bez zer wiodących 6
GG zegar w formacie 24-godzinnym z zerem wiodącym 06
k liczba godzin w formacie 24-godzinnym 18
K liczba godzin w formacie 12-godzinnym 6
H czas w formacie 12-godzinnym bez zer wiodących 6
gg czas w formacie 12-godzinnym z zerem wiodącym 06
M minuty bez zer wiodących 32
mm minuty z zerem na początku 32
S sekundy bez zer wiodących jedenaście
SS sekundy z zerem wiodącym jedenaście
S milisekundy 297
z Strefa czasowa EET
Z strefa czasowa w formacie RFC 822 300
Przykłady kombinacji znaków wzoru:
Próbka Przykład
Dd / mm / rrrr 01-11-2020
rrrr-MM-dd 2019-10-01
GG:mm:ss.SSS 23:59,59,999
rrrr-MM-dd GG:mm:ss 30.11.2018 03:09:02
rrrr-MM-dd GG:mm:ss.SSS 2016-03-01 01:20:47.999
rrrr-MM-dd GG:mm:ss.SSS Z 2013-13-13 23:59:59.999 +0100
Jeśli popełnisz drobny błąd w formacie, możesz stać się właścicielem wyjątku java.text.ParseException, a nie jest to szczególnie przyjemne osiągnięcie. Cóż, krótka wycieczka po SimpleDateFormat dobiegła końca - wróćmy do dotychczasowego tłumaczenia ciągu znaków w Javie . SimpleDateFormat daje nam takie możliwości i krok po kroku przeprowadzimy ten proces.
  1. Utwórz linię, z której musisz ustawić datę:

    String strDate = "Sat, April 4, 2020";
  2. Tworzymy nowy obiekt SimpleDateFormat z szablonem pasującym do tego, co mamy w ciągu znaków (w przeciwnym razie nie będziemy mogli go przeanalizować):

    SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMMM d, yyyy", Locale.ENGLISH);

    Jak widać, mamy tutaj argument dotyczący ustawień regionalnych. Jeśli to pominiemy, użyje domyślnych ustawień regionalnych, które nie zawsze są angielskie.

    Jeśli ustawienia regionalne nie pasują do ciągu wejściowego, wówczas dane ciągu znaków powiązane z językiem, takie jak nasze Mon lub April , nie zostaną rozpoznane i wygenerują wyjątek java.text.ParseException, nawet jeśli wzorzec będzie zgodny.

    Nie musimy jednak określać formatu, jeśli używamy szablonu, który nie jest specyficzny dla języka. Na przykład - rrrr-MM-dd GG:mm:ss

  3. Tworzymy datę za pomocą formatera, który z kolei analizuje ją na podstawie ciągu wejściowego:

    try {
      Date date = formatter.parse(strDate);
      System.out.println(date);
    }
    catch (ParseException e) {
      e.printStackTrace();
    }

    Wyjście konsoli:

    
    Sat Apr 04 00:00:00 EEST 2020

    Hmmm... Ale format nie jest już taki sam!

    Aby utworzyć ten sam format, ponownie używamy formatera:

    System.out.println(formatter.format(date));

    Wyjście konsoli:

    
    Sat, April 4, 2020

SimpleDateFormat i kalendarz

SimpleDateFormat umożliwia formatowanie wszystkich utworzonych obiektów daty i kalendarza do późniejszego wykorzystania. Rozważmy tak interesujący punkt, jak praca z epokami. Aby utworzyć datę „BC”, należy skorzystać z pola Kalendarz.Era. Przykładowo utwórzmy datę wskazującą bitwę pod Kannami, w której Hannibal pokonał armię Rzymu. Stało się to 2 sierpnia 216 roku p.n.e. mi.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
Tutaj wykorzystaliśmy klasę SimpleDateFormat do wyświetlenia daty w bardziej dla nas zrozumiałej formie (jak wskazano powyżej, za wyświetlenie ery odpowiadają litery „GG”). Wniosek:

02 авг 216 до н.э.

Format daty w Javie

Oto kolejny przypadek. Załóżmy, że ten format daty nam nie odpowiada:

Sat Nov 25 10:42:12 MSK 2017
Więc oto jest. Korzystając z naszych możliwości w formacie daty Java, możesz bez większych trudności zmienić go na własny:
public static void main(String[] args) {

   SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, d MMMM yyyy");
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(dateFormat.format(calendar.getTime()));
}
Wniosek:

суббота, 25 Ноябрь 2017
Dużo lepiej, prawda? :)
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION