CodeGym /Blog Jawa /Acak /Carane ora ilang ing wektu: DateTime lan Tanggalan
John Squirrels
tingkat
San Francisco

Carane ora ilang ing wektu: DateTime lan Tanggalan

Diterbitake ing grup
Hi! Dina iki kita bakal miwiti nggarap jinis data anyar sing durung ditemoni sadurunge, yaiku tanggal. Carane ora ilang ing wektu: DateTime lan Tanggalan - 1Aku ora mikir aku kudu nerangake apa iku tanggal. :) Ing asas, kita bisa nyimpen tanggal lan wektu saiki ing String Jawa biasa.

public class Main {
   public static void main(String[] args) {

       String date = "June 11, 2018";
       System.out.println(date);
   }
}
Nanging pendekatan iki nduweni akeh kekurangan. Kelas kasebut Stringdirancang kanggo nggarap teks, lan metode kasebut cocog kanggo tugas iki. Yen kita kudu ngapusi tanggal ing sawetara cara (tambah 2 jam, contone), Stringora bisa dadi apik. Utawa yen kita pengin nampilake tanggal lan wektu saiki nalika program dikompilasi. Stringora mbantu ing kene: nalika sampeyan nulis kode lan mbukak, wektu bakal diganti lan konsol bakal nampilake informasi sing salah. Pramila pangripta Jawa nyedhiyakake sawetara kelas kanggo nggarap tanggal lan wektu. Sing pisanan yaikujava.util.Date

Kelas tanggal

Kita nemtokake jeneng lengkap, amarga paket Java liyane duwe kelas java.sql.Date. Aja nyampur! Wangsulan: Bab ingkang pisanan sampeyan kudu ngerti bab iku nyimpen tanggal minangka nomer milliseconds sing wis liwati wiwit 1 Januari 1970. Sistem wektu iki malah duwe jeneng dhewe: " Unix-wektu " A pendekatan rada menarik, bakal ' sampeyan setuju? :) Ing bab kapindho worth ngelengke punika: Yen sampeyan nggawe Dateobyek nggunakake konstruktor standar, asil nggantosi tanggal lan wektu saiki ing wayahe obyek digawe . Elinga yen kita ngandika sing tanggal dituduhake minangka Stringbakal perjuangan karo tugas kuwi? Kelas Datenangani kanthi gampang.

public class Main {
   public static void main(String[] args) {

       Date date = new Date();
       System.out.println(date);
   }
}
Mbukak kode iki kaping pirang-pirang, lan sampeyan bakal weruh owah-owahan wektu bola-bali. :) Iki bisa uga amarga wektu disimpen minangka milidetik: unit wektu sing cilik banget, saengga asile akurat banget. Kelas Datekonstruktor liyane: sampeyan bisa ngliwati jumlah milidetik sing tepat wiwit jam 00:00 tanggal 1 Januari 1970 nganti tanggal sing dibutuhake, lan obyek tanggal sing cocog bakal digawe:

public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
Output konsol: Jum 30 Mei 04:20:12 GMT 2008 We njaluk 30 Mei 2008. "Jum" nuduhake dina minggu (Jum'ah, duh), lan GMT minangka zona wektu (Greenwich Mean Time). Milidetik dilewati minangka longs, amarga jumlah milidetik biasane ora pas karo int. Dadi, operasi apa karo tanggal sing kudu ditindakake? Inggih, sing paling jelas, mesthi, yaiku perbandingan . Kanggo nemtokake manawa siji tanggal teka sadurunge utawa sawise liyane. Iki bisa ditindakake kanthi pirang-pirang cara. Contone, sampeyan bisa nelpon Date.getTime()cara, sing ngasilake nomer milidetik sing wis liwati wiwit tengah wengi tanggal 1 Januari 1970. Cukup nelpon ing rong obyek Tanggal lan mbandhingake asil:

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");
   }
}
Output: date1 luwih awal tinimbang date2 Nanging ana uga cara sing luwih trep, yaiku nggunakake metode khusus sing diwenehake dening kelas Date: before(), after()lan equals(). Kabeh mau ngasilake nilai boolean. Cara before()mriksa manawa tanggal kita luwih dhisik tinimbang tanggal sing dilewati minangka argumen:

public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

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

       System.out.println(date1.before(date2));
   }
}
Output konsol: bener Kajaba iku, after()cara mriksa kanggo ndeleng yen tanggal kita luwih saka tanggal liwati minangka argumen:

public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

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

       System.out.println(date1.after(date2));
   }
}
Output konsol: palsu Ing conto kita, kita "nyelehake program kanggo turu" kanggo 2 detik, supaya loro tanggal dijamin beda. Ing komputer cepet, wektu antarane nggawe date1lan date2bisa kurang saka siji milidetik, nyebabake loro before()lan after()bali palsu. Nanging ing kasus iki, equals()cara bakal bali bener! Sawise kabeh, mbandhingake jumlah milidetik wiwit jam 00:00 tanggal 1 Januari 1970 kanggo saben tanggal. Obyek dianggep padha mung yen padha cocog karo milidetik :

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));
}
Mangkene prekara liyane sing kudu digatekake. Yen sampeyan mbukak dokumentasi kanggo Datekelas ing situs web Oracle , sampeyan bakal weruh manawa akeh metode lan konstruktor wis ditandhani minangka Ditinggalake (yaiku ora dianjurake kanggo digunakake). Mangkene apa sing dicritakake para pangripta Jawa babagan bagean kelas sing wis ora digunakake:
"Elemen program annotated @Deprecated minangka programer sing ora dianjurake kanggo nggunakake, biasane amarga mbebayani, utawa amarga ana alternatif sing luwih apik."
Iki ora ateges cara kasebut ora bisa digunakake. Yen sampeyan nyoba kanggo mbukak kode nggunakake cara deprecated ing IDE, iku bakal paling kamungkinan bisa Contone, nimbang cara deprecated Date.getHours(), kang ngasilake nomer jam gadhah Dateobyek.

public static void main(String[] args) {

   Date date1 = new Date();

   System.out.println(date1.getHours());
}
Yen sampeyan miwiti kode ing 14:21 (2:21 PM), bakal nampilake nomer 14. Nalika sampeyan bisa ndeleng, cara deprecated wis nyabrang metu, nanging isih bisa. Cara kasebut ora dicopot supaya ora ngrusak akeh kode sing wis ana sing nggunakake. Ing tembung liya, cara kasebut ora "rusak" utawa "dibusak". Dheweke mung ora dianjurake kanggo nggunakake amarga ana alternatif sing luwih trep. Ora sengaja, dokumentasi kasebut kanthi khusus nyebutake alternatif iki:
Carane ora ilang ing wektu: DateTime lan Tanggalan - 2
Umume Datemetode kelas wis dipindhah menyang Calendarkelas sing luwih apik lan ditambahi. Sabanjure kita bakal kenalan karo kelas kasebut. :)

Kelas kalender

JDK 1.1 ngenalaken kelas anyar Calendar:. Iku nggawe nggarap tanggal ing Jawa luwih gampang tinimbang sadurunge. Siji-sijine implementasi kelas Calendarsing bakal ditindakake yaiku GregorianCalendarkelas. Iki ngleksanakake kalender Gregorian, sing diamati dening akeh negara ing donya. Kauntungan utama yaiku bisa nggarap tanggal kanthi format sing luwih trep. Contone, bisa:
  • Tambah sasi utawa dina menyang tanggal saiki
  • Priksa manawa taun kasebut minangka taun kabisat;
  • Mbalekake komponen individu tanggal (contone, ekstrak nomer sasi saka tanggal wutuh)
  • Uga ngemot sistem konstanta sing trep banget (akeh sing bakal kita deleng ing ngisor iki).
Peningkatan penting liyane saka Calendarkelas yaiku konstanta Calendar.ERA : sampeyan bisa nunjukake tanggal sadurunge jaman umum (SM - sadurunge Kristus) utawa ing jaman umum (AD - Anno Domini). Ayo ndeleng kabeh iki kanthi conto. Ayo nggawe calendarobyek kanthi tanggal 25 Januari 2017:

public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
Ing Calendarkelas (uga Datekelas kanggo perkara kasebut), sasi diwiwiti saka nol , supaya kita ngliwati angka 0 minangka argumen kapindho. Nalika nggarap kelas Calendar, penting kanggo ngerti yen iki mung tanggalan , dudu tanggal individu. Carane ora ilang ing wektu: DateTime lan Tanggalan - 3 Tanggal mung sawetara nomer sing nuduhake interval wektu tartamtu. Tanggalan minangka sistem wutuh sing ngidini sampeyan nindakake akeh perkara karo tanggal. :) Iki katon akeh banget yen sampeyan nyoba nampilake Calendarobyek kasebut: Output: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Eropa/London",offset=0,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_MONTH=25,DAY_SUN_DAY ,DAY_MINGGU_IN_MONTH=?,AM_PM=0,Jam=0,Jam_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?] Delengen pinten informasi sing sampeyan entuk ! A tanggalan wis Bunch saka sifat sing tanggal normal ora duwe, lan kabeh mau ditampilake (iki carane caratoString()bisa ingCalendarkelas). Yen sampeyan mung perlu kanggo njaluk tanggal prasaja saka tanggalan, IE obyekDate, nggunakakeCalendar.getTime()cara (jeneng ora paling logis, nanging apa sampeyan bisa nindakake?):

public static void main(String[] args) {

   Calendar calendar = new GregorianCalendar(2017, 0 , 25);
   Date date = calendar.getTime();
   System.out.println(date);
}
Output: Wed Jan 25 00:00:00 GMT 2017 Saiki kita wis njupuk tanggalan lan "nyuda" menyang tanggal biasa. Ayo dadi luwih. Saliyane nemtokake sasi miturut nomer, sampeyan bisa nggunakake nilai kolom konstanCalendar kelas . Konstanta iki minangka kolom statis saka kelas kanthi nilai prasetel sing ora bisa diganti. Iki minangka pilihan sing luwih apik, amarga nggunakake kode kasebut nambah keterbacaan kode sampeyan. Calendar

public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Tanggalan.JANUARI minangka salah sawijining konstanta sing nggambarake sasi ing taun. Nggunakake konstanta sing dijenengi iki, ora ana sing bakal lali, umpamane, yen nomer 3 tegese April, lan dudu sasi katelu, sing kita seneng nelpon Maret. Cukup nulis Calendar.APRIL , lan sampeyan wis rampung. :) Kabeh kolom tanggalan (nomer, sasi, menit, detik, lan sapiturute) bisa ditemtokake kanthi kapisah nggunakakeset()metode kasebut. Cara iki trep banget, amargaCalendarkelas nduweni konstanta kanggo saben lapangan, lan kode sing diasilake gampang diwaca. Ing conto pungkasan, kita nggawe tanggal, nanging ora nyetel wektu. Ayo nyetel wektu 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());
}
Output: Wed Jan 25 19:42:12 GMT 2017 We nelpon set()cara, maringaken pancet (gumantung ing lapangan kita arep kanggo ngganti) lan Nilai anyar kanggo lapangan. Pranyata set()cara iki minangka jinis "super-setter" sing ngerti carane nyetel nilai ora mung kanggo siji lapangan, nanging kanggo akeh lapangan. :) CalendarKelas nggunakake add()cara kanggo nambah lan nyuda nilai. Sampeyan pass ing lapangan sing pengin ngganti, lan nomer (persis carane akeh sing pengin nambah / nyuda saka Nilai saiki). Contone, ayo entuk tanggal 2 wulan sadurunge tanggal sing digawe:

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, pass a negative number
   System.out.println(calendar.getTime());
}
Output: Jum 25 Nov 19:42:12 GMT 2016 Apik banget! Kita entuk tanggal 2 wulan kepungkur. Iki ora mung nyebabake owah-owahan sasi: taun uga diganti saka 2017 dadi 2016. Mesthi, nalika ngowahi tanggal, taun saiki diitung kanthi otomatis tanpa perlu sampeyan nglacak kanthi manual. Nanging yen ana alesan sampeyan kudu mateni prilaku iki, sampeyan bisa nindakake. Cara kasebut roll()bisa nambah lan nyuda nilai tanpa mengaruhi nilai sing isih ana . Contone, kaya iki:

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());
}
Kita nindakake persis kaya ing conto sadurunge: kita njupuk 2 sasi saka tanggal saiki. Nanging saiki kode kasebut beda-beda: sasi wis diganti saka Januari nganti November, nanging taun kasebut ora owah-2017! Output: Sat 25 Nov 10:42:12 GMT 2017 Ngalih bebarengan. Kaya sing kasebut ing ndhuwur, kita bisa entuk kabeh Calendarlapangan kanthi kapisah. Kita nindakake iki kanthi get()cara:

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("Week in the month: " + calendar.get(Calendar.WEEK_OF_MONTH));// Week in this month?

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

   System.out.println("Hours: " + 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));

}
Output: Taun: 2017 Wulan: 0 Minggu ing sasi: 5 Dina: 25 Jam: 10 Menit: 42 Detik: 12 Milidetik: 0 Dadi, saliyane Calendar"super-setter" kelas, ana uga "super-getter". ". :) Mesthi, aspek menarik liyane saka kelas iki nggarap eras. Kanggo nggawe tanggal "BC", sampeyan kudu nggunakake kolom Calendar.ERA Contone, ayo nggawe tanggal kanggo Peperangan Cannae, ing ngendi Hannibal ngalahake tentara Romawi. Iki kedadeyan tanggal 2 Agustus 216 SM:

public static void main(String[] args) {
   GregorianCalendar cannae = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannae.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("MMM dd, yyy GG");
   System.out.println(df.format(cannae.getTime()));
}
Ing kene kita nggunakake SimpleDateFormatkelas kanggo nyithak tanggal kanthi format sing luwih gampang dimangerteni (huruf "GG" nuduhake yen kita pengin jaman kasebut ditampilake). Output: 02 Agustus 216 SM. Kelas kasebut Calendarduwe akeh metode lan konstanta. Sampeyan bisa maca babagan kasebut ing dokumentasi . Yen sampeyan ora seneng karo format tanggal iki Sat Nov 25 10:42:12 GMT 2017 sampeyan bisa nggunakake SimpleDateFormatkanthi gampang nggawe apa sing dikarepake.

public static void main(String[] args) {

   SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, MMMM d, 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()));
}
Output: Setu, 25 November 2017 Luwih apik, ta? :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION