JavaRush /Java Blogu /Random-AZ /Vaxtı necə itirməmək olar - DateTime və Calendar

Vaxtı necə itirməmək olar - DateTime və Calendar

Qrupda dərc edilmişdir
Salam! Bu gün biz əvvəllər rast gəlmədiyimiz yeni məlumat növü, yəni tarixlərlə işə başlayacağıq. Vaxtı necə itirməmək olar - DateTime və Calendar - 1Düşünürəm ki, tarixin nə olduğunu izah etməyə ehtiyac yoxdur :) Prinsipcə, Java-da cari tarixi və vaxtı adi sətirdə yazmaq tamamilə mümkündür.
public class Main {
   public static void main(String[] args) {

       String date = "June 11, 2018";
       System.out.println(date);
   }
}
Ancaq bu yanaşmanın bir çox mənfi cəhətləri var. Sinif Stringmətnlə işləmək üçün yaradılmışdır və müvafiq metodlara malikdir. Tarixi bir şəkildə idarə etməliyiksə (məsələn, ona 2 saat əlavə edin), o, Stringburada işləməyəcək. Və ya, məsələn, proqramın konsolda tərtib edildiyi anda cari tarixi və vaxtı göstərin. Bu, burada Stringda kömək etməyəcək: kodu yazıb onu işə salarkən vaxt dəyişəcək və uyğun olmayanlar konsolda görünəcək. Buna görə də, Java-da onun yaradıcıları tarix və vaxtlarla işləmək üçün bir neçə sinif təqdim etdilər. Birincisi sinifdirjava.util.Date

Java Tarix Sinfi

Biz ona tam adını verdik, çünki Java-da başqa paketdə də bir sinif var java.sql.Date. Qarışıq olmayın! Bu barədə bilməli olduğunuz ilk şey, 1970-ci il yanvarın 1-dən keçmiş tarixi millisaniyələrdə saxlamasıdır . Bu tarix üçün hətta ayrıca bir ad var - “Unix time”. Olduqca maraqlı üsuldur, razı deyilsiniz? Date:) Yadda saxlamaq lazım olan ikinci şey: boş konstruktorla obyekt yaratsanız , nəticə obyektin yaradıldığı vaxtın cari tarixi və vaxtı olacaq . Tarix formatı üçün Stringbelə bir tapşırığın problemli olacağını necə yazdığımızı xatırlayırsınızmı? Sinif Datebunu asanlıqla həll edir.
public class Main {
   public static void main(String[] args) {

       Date date = new Date();
       System.out.println(date);
   }
}
Bu kodu bir neçə dəfə işlədin və hər dəfə vaxtın necə dəyişəcəyini görəcəksiniz :) Bu, millisaniyələrdə saxlandığı üçün mümkündür: onlar ən kiçik zaman vahidləridir, buna görə də nəticələr çox dəqiqdir. Üçün başqa bir konstruktor var Date: 1 yanvar 1970-ci il saat 00:00-dan tələb olunan tarixə qədər keçən millisaniyələrin dəqiq sayını təyin edə bilərsiniz və o yaradılacaq:
public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
Konsol çıxışı:

Fri May 30 08:20:12 MSD 2008
30 may 2008-ci ildə əldə etmişik. "Cümə" həftənin günü deməkdir - "Cümə" (Cümə) və MSD - "Moskva Yay vaxtı" (Moskva yay vaxtı). Millisaniyələr formatda ötürülür long, çünki onların sayı çox vaxt uyğun gəlmir int. Beləliklə, işimizdə hansı tarix əməliyyatlarına ehtiyacımız ola bilər? Yaxşı, ən bariz şey, əlbəttə ki, müqayisədir . Bir tarixin digərindən gec və ya daha erkən olduğunu müəyyənləşdirin. Bu müxtəlif yollarla edilə bilər. Məsələn, Date.getTime()1970-ci il yanvarın 1-də gecə yarısından bəri keçən millisaniyələrin sayını qaytaracaq metodu çağıra bilərsiniz. Gəlin onu iki Date obyektinə çağıraq və onları bir-biri ilə müqayisə edək:
public class Main {
   public static void main(String[] args) {

       Date date1 = new Date();

       Date date2 = new Date();

       System.out.println((date1.getTime() > date2.getTime())?
               "date1 is later than date2" : "date1 is earlier than date2");
   }
}
Nəticə:

date1 раньше date2
Ancaq daha rahat bir yol var, yəni sinfin xüsusi üsullarından istifadə etmək Date: before(), after()equals(). Hamısı nəticəni qaytarır boolean. Metod before()bizim tariximizin arqument olaraq verdiyimiz tarixdən əvvəl olub olmadığını yoxlayır:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.before(date2));
   }
}
Konsol çıxışı:

true
Metod oxşar şəkildə işləyir after(); tariximizin arqument olaraq verdiyimiz tarixdən gec olub olmadığını yoxlayır:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.after(date2));
   }
}
Konsol çıxışı:

false
Nümunələrimizdə proqramı 2 saniyə yuxu rejiminə qoyuruq ki, iki tarixin fərqli olacağına zəmanət verilir. date1Sürətli kompüterlərdə yaratma ilə arasındakı vaxt date2bir millisaniyədən az ola bilər, bu halda həm və before()həm də after()qayıdacaq false. equals()Ancaq belə bir vəziyyətdə üsul geri dönəcək true! Axı o, hər bir tarix üçün 1970-ci il yanvarın 1-i saat 00:00-dan bəri keçən millisaniyələrin sayını dəqiq müqayisə edir. Obyektlər yalnız millisaniyə qədər uyğun olduqda bərabər hesab ediləcək:
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));
}
Burada diqqət etməli olduğunuz başqa bir şey var. Oracle veb saytında sinif üçün sənədləri açsanız , onun bir çox metodları və konstruktorlarının (“köhnəlmiş”) Datekimi təyin edildiyini görəcəksiniz . DeprecatedBudur, baxın: Sinif Tarixi Java yaradıcılarının özləri köhnəlmiş sinif hissələri haqqında nə deyirlər: “@Deprecated ilə şərh edilmiş proqram elementi, adətən təhlükəli olduğu və ya buna görə proqramçıların istifadə etməkdən çəkindirdiyi bir şeydir. daha yaxşı alternativ var”. Bu o demək deyil ki, bu üsullardan ümumiyyətlə istifadə etmək olmaz. Date.getHours()Bundan əlavə, siz IDEA-da onlardan istifadə edərək kodu özünüz işlətməyə çalışsanız, çox güman ki, işləyəcək.Məsələn , obyektdən saatların sayını qaytaran köhnəlmiş metodu götürək Date.
public static void main(String[] args) {

   Date date1 = new Date();

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

}
Əgər kodu işlətdiyiniz zaman, məsələn, saat 14:21-dirsə, o, 14 rəqəmini göstərəcək. Gördüyünüz kimi, köhnəlmiş metodun üstündən xətt çəkilib, lakin olduqca yaxşı işləyir. Bu üsullar, onlardan istifadə edərək artıq yazılmış bir dəstə kodu pozmamaq üçün tamamilə silinmədi. Yəni, bu üsullar "sındırılmır" və ya "çıxarılmır", daha əlverişli alternativin mövcudluğuna görə istifadə üçün tövsiyə edilmir. Yeri gəlmişkən, bu barədə sənədlərdə belə yazılıb: Vaxtı necə itirməmək olar - DateTime və Calendar - 2Date sinfinin metodlarının əksəriyyəti onun təkmilləşdirilmiş, genişləndirilmiş versiyasına - sinifə köçürüldü Calendar. Onunla daha yaxından tanış olacağıq :)

Java Təqvimi

Java 1.1 yeni bir sinif təqdim etdi - Calendar. O, Java-da tarixlərlə işləməyi əvvəlkindən bir qədər asanlaşdırdı. CalendarÇalışacağımız sinifin yeganə tətbiqi sinifdir GregorianCalendar(dünyanın əksər ölkələrinin yaşadığı Qriqorian təqvimini tətbiq edir). Onun əsas rahatlığı tarixlərlə daha rahat formatda işləyə bilməsidir. Məsələn, o edə bilər:
  • Cari tarixə bir ay və ya gün əlavə edin
  • İlin sıçrayış ili olub olmadığını yoxlayın;
  • Fərdi tarix komponentlərini əldə edin (məsələn, bütün tarixdən ay nömrəsini alın)
  • Həm də onun daxilində çox rahat sabitlər sistemi hazırlanmışdır (onların çoxunu aşağıda görəcəyik).
Sinfin digər mühüm fərqi Calendarodur ki, o, sabiti həyata keçirir Calendar.Era: tarixi eramızdan əvvəl (“Məsihdən əvvəl” - Məsihin doğulmasından əvvəl, yəni “bizim eradan əvvəl”) və ya AC (“Məsihdən sonra” - “ bizim dövrümüz"). Bütün bunlara nümunələrlə baxaq. 25 yanvar 2017-ci il tarixi ilə təqvim yaradaq:
public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
Sinifdə aylar Calendar(yeri gəlmişkən Date) sıfırdan başlayır, ona görə də biz ikinci arqument kimi 0 rəqəmini keçirdik. Bir siniflə işləyərkən əsas şey bunun ayrı bir tarix deyil, təqvimCalendar olduğunu başa düşməkdir . Tarix sadəcə müəyyən bir zaman dövrünü əks etdirən bir sıra nömrələrdir. Təqvim isə bütöv bir cihazdır ki, onunla tarixlərlə çox şey edə bilərsiniz :) Təqvim obyektini konsola çıxarmağa cəhd etsəniz, bunu aydın görmək olar: Çıxış: Vaxtı necə itirməmək olar - DateTime və Calendar - 3

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=?]
Görün nə qədər məlumat var! Təqvimdə adi tarixdə olmayan bir sıra xüsusiyyətlər var və onların hamısı konsola çıxarılır ( toString()sinfdəki metod belə işləyir Calendar). Əgər işləyərkən sadəcə təqvimdən sadə bir tarix almalısınız, yəni. obyekt Date- bu bir üsuldan istifadə etməklə edilir Calendar.getTime()(ad ən məntiqli deyil, lakin heç bir şey edilə bilməz):
public static void main(String[] args) {

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

Wed Jan 25 00:00:00 MSK 2017
İndi biz təqvimi adi bir tarixə “sadələşdirmişik”. Gəlin davam edək. Aylar üçün ədədi simvollarla yanaşı, Calendarsinifdə sabitlərdən istifadə edilə bilər. CalendarSabitlər dəyişdirilə bilməyən artıq təyin edilmiş dəyəri olan bir sinfin statik sahələridir . Bu seçim əslində daha yaxşıdır, çünki kodun oxunuşunu yaxşılaşdırır.
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Calendar.JANUARY— ayı göstərmək üçün sabitlərdən biri. Bu adlandırma seçimi ilə, məsələn, "3" rəqəminin öyrəşdiyimiz üçüncü ay - mart deyil, aprel olduğunu heç kim unutmayacaq. Siz sadəcə yazın Calendar.APRIL- vəssalam :) Bütün təqvim sahələri (gün, ay, dəqiqə, saniyə və s.) metoddan istifadə edərək fərdi olaraq təyin edilə bilər set(). Bu, çox rahatdır, çünki Calendarsinifdə hər bir sahənin öz sabiti var və son kod mümkün qədər sadə görünəcəkdir. Məsələn, əvvəlki nümunədə tarix yaratdıq, lakin onun üçün cari vaxtı təyin etmədik. Gəlin vaxtı 19:42:12-yə təyin edək
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());
}
Nəticə:

Wed Jan 25 19:42:12 MSK 2017
Biz metodu çağırırıq set(), ona sabiti (dəyişdirmək istədiyimiz sahədən asılı olaraq) və bu sahə üçün yeni qiymət veririk. Məlum oldu ki, metod set()bir sahə üçün deyil, bir çox sahələr üçün dəyər təyin edə bilən bir növ "super-setter"dir :) Bir sinifdə dəyərlərin əlavə edilməsi və Calendarçıxarılması add(). Siz ona dəyişdirmək istədiyiniz sahəni və rəqəmi - cari dəyərdən dəqiq nə qədər əlavə etmək/çıxmaq istədiyinizi daxil etməlisiniz. Məsələn, yaratdığımız tarixi 2 ay əvvələ təyin edək:
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);//to subtract a value - a negative number must be passed to the method
   System.out.println(calendar.getTime());
}
Nəticə:

Fri Nov 25 19:42:12 MSK 2016
Əla! Tarixi 2 ay əvvələ təyin etdik. Nəticədə, 2017-ci ildən 2016-cı ilə qədər təkcə ay deyil, il də dəyişdi.Tarixləri köçürərkən cari ilin hesablanması, təbii ki, avtomatik olaraq həyata keçirilir və əl ilə idarə edilməsinə ehtiyac yoxdur. Ancaq hansısa məqsəd üçün bu davranışı aradan qaldırmaq lazımdırsa, bunu edə bilərsiniz. Xüsusi bir üsul roll()digər dəyərlərə təsir etmədən dəyərləri əlavə edə və çıxara bilər. Məsələn, bu kimi:
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());
}
Əvvəlki nümunədə olduğu kimi eyni şeyi etdik - cari tarixdən 2 ayı çıxardıq. Amma indi kod fərqli işləyirdi: ay yanvardan noyabra qədər dəyişdi, lakin il 2017-ci ildə olduğu kimi qaldı! Nəticə:

Sat Nov 25 10:42:12 MSK 2017
Daha. Yuxarıda dediyimiz kimi, obyektin bütün sahələrini Calendarayrıca əldə etmək olar. Metod buna cavabdehdir 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("Year: " + calendar.get(Calendar.YEAR));
   System.out.println("Month: " + calendar.get(Calendar.MONTH));
   System.out.println("Number of the week in the month: " + calendar.get(Calendar.WEEK_OF_MONTH));// serial number of the week in the month

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

   System.out.println("Watch: " + calendar.get(Calendar.HOUR));
   System.out.println("Minutes: " + calendar.get(Calendar.MINUTE));
   System.out.println("Seconds: " + calendar.get(Calendar.SECOND));
   System.out.println("Milliseconds: " + calendar.get(Calendar.MILLISECOND));

}
Nəticə:

Год: 2017 
Месяц: 0 
Порядковый номер недели в месяце: 4 
Число: 25 
Часы: 10 
Минуты: 42 
Секунды: 12 
Миллисекунды: 0
Yəni sinifdə “super-setter”lə yanaşı, Calendar“super-getter” də var :) Başqa bir maraqlı məqam, təbii ki, dövrlərlə işləməkdir. Tarix yaratmaq üçün "BC" sahəsindən istifadə etməlisiniz Calendar.Era Məsələn, Hannibalın Roma ordusunu məğlub etdiyi Kanna döyüşünü göstərən bir tarix yaradaq. Bu, eramızdan əvvəl 216-cı il avqustun 2-də baş verdi. e.:
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()));
}
Burada biz sinifdən SimpleDateFormattarixi bizə daha başa düşülən formatda göstərmək üçün istifadə etdik (“GG” hərfləri dövrün göstərilməsinə cavabdehdir). Nəticə:

02 авг 216 до н.э.
Sinifdə Calendardaha çox üsul və sabitlər var , onlar haqqında sənədlərdə oxuyun:

Sətir Tarixə çevrilir

String to Date çevirmək üçün Java köməkçi sinfindən istifadə edə bilərsiniz - SimpleDateFormat . Bu, tarixi təyin etdiyiniz formata çevirmək üçün lazım olan sinifdir. Öz növbəsində, DateFormat-Vaxtı necə itirməmək olar - DateTime və Calendar - 5 a çox bənzəyir . İkisi arasında yeganə diqqətəlayiq fərq SimpleDateFormat-ın formatlaşdırma (tarixi sətirə çevirmək) və sətri yerli məlumatlı tarixə təhlil etmək üçün istifadə oluna bilməsidir, halbuki DateFormat yerli dili dəstəkləmir. Bundan əlavə, DateFormat tarixlərin formatlaşdırılması və təhlili üçün əsas dəstəyi təmin edən mücərrəd sinifdir, SimpleDateFormat isə DateFormat sinifini genişləndirən konkret sinifdir. SimpleDateFormat obyektinin yaradılması və Tarixin formatlaşdırılması nümunəsi belə görünür:
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);

System.out.println(formatter.format(date));
Yuxarıdakı misalda biz "yyyy-AA-gg SS:dd:ss" nümunəsindən istifadə etdik, yəni:
  • il üçün 4 rəqəm (yyyy);
  • ay üçün 2 rəqəm (MM);
  • gün üçün 2 rəqəm (dd);
  • 24 saat formatında (HH) saatlar üçün 2 rəqəm;
  • dəqiqə üçün 2 rəqəm (mm);
  • saniyə üçün 2 rəqəm (ss).
Ayırma işarələri və naxış simvollarının sırası qorunub saxlanılır. Konsol çıxışı:
2008-05-30 08:20:12
SimpleDateFormat sinfi üçün kifayət qədər çox şablon hərf var . Çaşqın olmamağınız üçün onları cədvəldə topladıq:
Simvol Təsvir Misal
G dövr (ingilis dilində - eramızdan əvvəl və e.ə.) AD
y il (4 rəqəmli rəqəm) 2020
yy il (son 2 rəqəm) 20
yyyy il (4 rəqəmli rəqəm) 2020
M ay nömrəsi (baş sıfırlar olmadan) 8
MM ayın nömrəsi (ayın sayı < 10 olarsa, başlanğıc sıfırlarla) 04
MMM üç hərfli ay abbreviaturası (lokallaşmaya görə) Yanvar
MMMM tam ay adı iyun
w ilin həftəsi (aşağıdakı sıfırlar olmadan) 4
ww ilin həftəsi (aparıcı sıfırlarla) 04
W ayda həftə (baş sıfırlar olmadan) 3
WW ayda həftə (aparıcı sıfır ilə) 03
D ilin günü 67
d ayın günü (baş sıfırlar olmadan) 9
gg ayın günü (başdakı sıfırlarla) 09
F ayda həftənin günü (aşağıdakı sıfırlar olmadan) 9
FF ayda həftənin günü (baş sıfırlarla) 09
E həftənin günü (qısaltma) W
EEEE həftənin günü (tam) Cümə
u həftənin nömrəsi (baş sıfırlar olmadan) 5
uu həftənin gününün sayı (başdakı sıfırlarla) 05
a AM/PM marker A.M.
H saatlar 24 saat formatında sıfırlar olmadan 6
H H 24 saat formatında aparıcı sıfırla saat 06
k 24 saat formatında saatların sayı 18
K 12 saat formatında saatların sayı 6
h əvvəl sıfırlar olmadan 12 saatlıq formatda vaxt 6
H h vaxt 12 saat formatında başda sıfır olmaqla 06
m sıfırlar olmadan dəqiqə 32
mm dəqiqə aparıcı sıfır ilə 32
s əvvəl sıfırlar olmadan saniyə on bir
ss saniyə əvvəl sıfırla on bir
S millisaniyə 297
z Saat qurşağı EET
Z RFC 822 formatında saat qurşağı 300
Nümunə simvol birləşmələrinin nümunələri:
Nümunə Misal
gg-AA-yyyy 01-11-2020
yyyy-AA-gg 10-01-2019
SS:aa:ss.SSS 23:59.59.999
yyyy-AA-gg SS:aa:ss 30-11-2018 03:09:02
yyyy-AA-gg SS:aa:ss.SSS 2016-03-01 01:20:47.999
yyyy-AA-gg SS:aa:ss.SSS Z 2013-13-13 23:59:59.999 +0100
Formatla bağlı kiçik bir səhv etsəniz, java.text.ParseException sahibi ola bilərsiniz və bu, o qədər də xoş nailiyyət deyil. SimpleDateFormat- a qısa ekskursiya başa çatdı - bu günə qədər java string tərcüməsinə qayıdaq . SimpleDateFormat bizə belə imkanlar verir və biz bu prosesi addım-addım keçəcəyik.
  1. Tarixi təyin etməli olduğunuz sətir yaradın:

    String strDate = "Sat, April 4, 2020";
  2. Biz sətirdə əldə etdiyimizə uyğun şablonla yeni SimpleDateFormat obyekti yaradırıq (əks halda onu təhlil edə bilməyəcəyik):

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

    Gördüyünüz kimi, burada Yerli arqumentimiz var. Əgər onu buraxsaq, o, həmişə ingilis dilində olmayan standart Yerlidən istifadə edəcək.

    Əgər yerli parametr daxiletmə sətrinə uyğun gəlmirsə, o zaman bizim Mon və ya Aprel kimi dilə bağlı sətir verilənləri tanınmayacaq və nümunə uyğun gəlsə belə, java.text.ParseException atacaq.

    Bununla belə, biz dilə xas olmayan şablondan istifadə ediriksə, formatı müəyyən etməli deyilik. Nümunə olaraq - yyyy-AA-gg SS:dd:ss

  3. Formatlayıcıdan istifadə edərək tarix yaradırıq, o da öz növbəsində onu giriş sətirindən təhlil edir:

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

    Konsol çıxışı:

    
    Sat Apr 04 00:00:00 EEST 2020

    Hmmm... Amma format artıq əvvəlki kimi deyil!

    Eyni formatı etmək üçün yenidən formatlayıcıdan istifadə edirik:

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

    Konsol çıxışı:

    
    Sat, April 4, 2020

SimpleDateFormat və Təqvim

SimpleDateFormat sonradan istifadə etmək üçün yaratdığınız bütün Tarix və Təqvim obyektlərini formatlamağa imkan verir. Eralarla işləmək kimi maraqlı bir məqamı nəzərdən keçirək. “BC” tarixi yaratmaq üçün Calendar.Era sahəsindən istifadə etməlisiniz.Məsələn, Hannibalın Roma ordusunu məğlub etdiyi Kanna döyüşünü göstərən bir tarix yaradaq. Bu, eramızdan əvvəl 216-cı il avqustun 2-də baş verdi. e.:
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()));
}
Burada tarixi bizə daha başa düşülən formatda göstərmək üçün SimpleDateFormat sinfindən istifadə etdik (yuxarıda göstərildiyi kimi, “GG” hərfləri dövrün göstərilməsinə cavabdehdir). Nəticə:

02 авг 216 до н.э.

Java Tarix Format

Budur, başqa bir hal. Tutaq ki, bu tarix formatı bizə uyğun deyil:

Sat Nov 25 10:42:12 MSK 2017
Beləliklə, budur. Java tarix formatındakı imkanlarımızdan istifadə edərək, çox çətinlik çəkmədən onu özünüzə dəyişə bilərsiniz:
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()));
}
Nəticə:

суббота, 25 Ноябрь 2017
Daha yaxşı, elə deyilmi? :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION