public class Main {
public static void main(String[] args) {
String date = "June 11, 2018";
System.out.println(date);
}
}
Namun pendekatan ini mempunyai banyak kelemahan. Kelas String
dibuat untuk bekerja dengan teks, dan memiliki metode yang sesuai. Jika kita perlu mengatur tanggalnya (misalnya menambahkan 2 jam), itu String
tidak akan berfungsi di sini. Atau, misalnya, menampilkan tanggal dan waktu saat ini pada saat program dikompilasi ke dalam konsol. Ini juga tidak akan membantu di sini String
: saat Anda menulis kode dan menjalankannya, waktu akan berubah dan hal-hal yang tidak relevan akan ditampilkan di konsol. Oleh karena itu, di Java, penciptanya menyediakan beberapa kelas untuk bekerja dengan tanggal dan waktu. Yang pertama adalah kelasjava.util.Date
Kelas Tanggal Jawa
Kami memberinya nama lengkap karena ada juga kelas di paket lain di Javajava.sql.Date
. Jangan bingung! Hal pertama yang perlu Anda ketahui adalah ia menyimpan tanggal dalam milidetik yang telah berlalu sejak 1 Januari 1970. Bahkan ada nama tersendiri untuk tanggal ini - "Waktu Unix".Cara yang cukup menarik, setujukah Anda? :) Hal kedua yang perlu diingat: jika Anda membuat objek Date
dengan konstruktor kosong, hasilnya adalah tanggal dan waktu saat objek tersebut dibuat . String
Apakah Anda ingat bagaimana kami menulis bahwa tugas seperti itu akan menjadi masalah untuk format tanggal ? Kelas Date
menyelesaikannya dengan mudah.
public class Main {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
}
}
Jalankan kode ini beberapa kali dan Anda akan melihat bagaimana waktu akan berubah setiap kali :) Hal ini dimungkinkan karena disimpan dalam milidetik: ini adalah satuan waktu terkecil, itulah sebabnya hasilnya sangat akurat. Ada konstruktor lain untuk Date
: Anda dapat menentukan jumlah pasti milidetik yang telah berlalu dari 00:00 tanggal 1 Januari 1970 hingga tanggal yang diperlukan, dan itu akan dibuat:
public class Main {
public static void main(String[] args) {
Date date = new Date(1212121212121L);
System.out.println(date);
}
}
Keluaran konsol:
Fri May 30 08:20:12 MSD 2008
Kami mendapatkannya pada tanggal 30 Mei 2008. "Jumat" berarti hari dalam seminggu - "Jumat" (Jumat), dan MSD - "Moscow Daylight Saving" (waktu musim panas Moskow). Milidetik ditransmisikan dalam format long
, karena jumlahnya sering kali tidak sesuai dengan int
. Jadi, operasi tanggal seperti apa yang mungkin kita perlukan dalam pekerjaan kita? Nah, yang paling kentara tentu saja adalah perbandingan . Tentukan apakah suatu tanggal lebih lambat atau lebih awal dari tanggal lainnya. Hal ini dapat dilakukan dengan berbagai cara. Misalnya, Anda dapat memanggil metode . Date.getTime()
, yang akan mengembalikan jumlah milidetik yang telah berlalu sejak tengah malam pada tanggal 1 Januari 1970. Mari kita panggil saja dua objek Date dan bandingkan satu sama lain:
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");
}
}
Kesimpulan:
date1 раньше date2
Namun ada cara yang lebih mudah, yaitu menggunakan metode khusus dari kelas Date
: before()
, after()
dan equals()
. Mereka semua mengembalikan hasilnya boolean
. Metode ini before()
memeriksa apakah tanggal kita lebih awal dari tanggal yang kita berikan sebagai argumen:
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));
}
}
Keluaran konsol:
true
Metode ini bekerja dengan cara yang sama after()
; ia memeriksa apakah tanggal kita lebih lambat dari tanggal yang kita berikan sebagai argumen:
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));
}
}
Keluaran konsol:
false
Dalam contoh kami, kami menidurkan program selama 2 detik sehingga kedua tanggal tersebut dijamin berbeda. Pada komputer yang cepat, waktu antara pembuatan date1
dan date2
dapat kurang dari satu milidetik, dalam hal ini keduanya dan before()
dan after()
akan kembali false
. Tapi metode equals()
dalam situasi seperti ini akan kembali true
! Lagi pula, ini membandingkan jumlah milidetik yang telah berlalu sejak pukul 00:00 tanggal 1 Januari 1970 untuk setiap tanggal. Objek hanya akan dianggap sama jika cocok hingga 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));
}
Inilah hal lain yang perlu Anda perhatikan. Jika Anda membuka dokumentasi untuk kelas tersebut Date
di situs web Oracle, Anda akan melihat bahwa banyak metode dan konstruktornya telah ditetapkan sebagai Deprecated
(“usang”). Di sini, lihat: Tanggal Kelas Inilah yang dikatakan oleh pembuat Java sendiri tentang bagian-bagian kelas yang sudah tidak digunakan lagi: “Elemen program yang dianotasi dengan @Deprecated adalah sesuatu yang tidak disarankan untuk digunakan oleh pemrogram, biasanya karena berbahaya, atau karena itu ada alternatif yang lebih baik.” Namun bukan berarti cara-cara tersebut tidak bisa digunakan sama sekali. Selain itu, jika Anda sendiri yang mencoba menjalankan kode menggunakan kode tersebut di IDEA, kemungkinan besar akan berhasil.Mari kita ambil contoh metode yang tidak digunakan lagi Date.getHours()
, yang mengembalikan jumlah jam dari suatu objek Date
.
public static void main(String[] args) {
Date date1 = new Date();
System.out.println(date1.getHours());
}
Jika pada saat Anda menjalankan kode, misalnya, waktu menunjukkan 14:21, maka akan muncul angka 14. Seperti yang Anda lihat, metode yang tidak digunakan lagi dicoret, tetapi berfungsi dengan baik. Metode-metode ini tidak dihapus sepenuhnya, agar tidak merusak sekumpulan kode yang sudah ditulis menggunakan metode tersebut. Artinya, metode ini tidak “rusak” atau “dihapus”, metode ini tidak direkomendasikan untuk digunakan karena tersedianya alternatif yang lebih nyaman. Omong-omong, hal ini tertulis tepat di dokumentasi: Sebagian besar metode kelas Date telah dipindahkan ke versi yang lebih baik dan diperluas - kelas Calendar
. Kita akan mengenalnya lebih jauh :)
Kalender Jawa
Java 1.1 memperkenalkan kelas baru -Calendar
. Dia membuat pengerjaan kurma di Java sedikit lebih mudah dibandingkan sebelumnya. Satu-satunya implementasi kelas Calendar
yang akan kami gunakan adalah kelas GregorianCalendar
(ini menerapkan kalender Gregorian, yang menurut sebagian besar negara di dunia hidup). Kenyamanan utamanya adalah dapat bekerja dengan tanggal dalam format yang lebih nyaman. Misalnya, dia dapat:
- Tambahkan bulan atau hari ke tanggal saat ini
- Periksa apakah tahun tersebut merupakan tahun kabisat;
- Dapatkan masing-masing komponen tanggal (misalnya, dapatkan nomor bulan dari keseluruhan tanggal)
- Dan juga, sistem konstanta yang sangat nyaman telah dikembangkan di dalamnya (kita akan melihat banyak di antaranya di bawah).
Calendar
adalah bahwa ia menerapkan konstanta Calendar.Era
: Anda dapat mengatur tanggal ke era SM (“Sebelum Kristus” - sebelum kelahiran Kristus, yaitu “sebelum zaman kita”) atau AC (“Setelah Kristus” - “ zaman kita"). Mari kita lihat semua ini dengan contoh. Mari kita buat kalender dengan tanggal 25 Januari 2017:
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
Bulan di kelas Calendar
(seperti Date
pada ) dimulai dari nol, jadi kami meneruskan angka 0 sebagai argumen kedua. Hal utama ketika bekerja dengan kelas Calendar
adalah memahami bahwa ini adalah kalender , dan bukan tanggal terpisah. Tanggal hanyalah serangkaian angka yang mewakili periode waktu tertentu. Dan kalender adalah keseluruhan perangkat yang dengannya Anda dapat melakukan banyak hal dengan tanggal :) Ini dapat dilihat dengan jelas jika Anda mencoba mengeluarkan objek Kalender ke konsol: Output:
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=?]
Lihat berapa banyak informasi yang ada! Kalender memiliki banyak properti yang tidak dimiliki tanggal biasa, dan semuanya di-output ke konsol (begitulah cara kerja metode toString()
di kelas Calendar
). Jika saat bekerja Anda hanya perlu mendapatkan tanggal sederhana dari kalender, mis. objek Date
- ini dilakukan dengan menggunakan metode Calendar.getTime()
(namanya bukan yang paling logis, tetapi tidak ada yang bisa dilakukan):
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar(2017, 0 , 25);
Date date = calendar.getTime();
System.out.println(date);
}
Kesimpulan:
Wed Jan 25 00:00:00 MSK 2017
Sekarang kami telah “menyederhanakan” kalender menjadi tanggal biasa. Mari kita lanjutkan. Selain simbol numerik untuk bulan, Calendar
konstanta dapat digunakan di kelas. Konstanta adalah bidang statis suatu kelas Calendar
dengan nilai yang sudah ditetapkan dan tidak dapat diubah. Opsi ini sebenarnya lebih baik karena meningkatkan keterbacaan kode.
public static void main(String[] args) {
GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Calendar.JANUARY
— salah satu konstanta untuk menunjukkan bulan. Dengan pilihan penamaan ini, tidak akan ada yang lupa, misalnya, bahwa angka “3” berarti April, dan bukan bulan ketiga yang biasa kita gunakan - Maret. Anda tinggal menulis Calendar.APRIL
- dan itu saja :) Semua bidang kalender (hari, bulan, menit, detik, dll.) dapat diatur satu per satu menggunakan metode ini set()
. Ini sangat mudah, karena Calendar
setiap bidang memiliki konstanta sendiri di kelasnya, dan kode akhir akan terlihat sesederhana mungkin. Misalnya, pada contoh sebelumnya, kita membuat tanggal, namun tidak menetapkan waktu saat ini untuk tanggal tersebut. Mari kita atur waktunya menjadi 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());
}
Kesimpulan:
Wed Jan 25 19:42:12 MSK 2017
Kita memanggil metode ini set()
, memberikan konstanta padanya (tergantung pada bidang yang ingin kita ubah) dan nilai baru untuk bidang ini. Ternyata metode tersebut set()
adalah semacam “super-setter” yang bisa menetapkan nilai bukan untuk satu field, tapi untuk banyak field :) Penjumlahan dan pengurangan nilai dalam suatu kelas Calendar
dilakukan dengan menggunakan metode add()
. Anda harus memasukkan bidang yang ingin Anda ubah, dan angkanya - berapa banyak yang ingin Anda tambahkan/kurangi dari nilai saat ini. Sebagai contoh, mari kita atur tanggal yang kita buat kembali ke 2 bulan yang lalu:
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());
}
Kesimpulan:
Fri Nov 25 19:42:12 MSK 2016
Besar! Kami telah menetapkan tanggal kembali ke 2 bulan yang lalu. Alhasil, tidak hanya bulannya saja yang berubah, tahun 2017 menjadi 2016. Perhitungan tahun berjalan dengan perpindahan tanggal tentunya dilakukan secara otomatis dan tidak perlu dikontrol secara manual. Namun jika karena tujuan tertentu Anda perlu menonaktifkan perilaku ini, Anda dapat melakukannya. Metode khusus roll()
dapat menambah dan mengurangi nilai tanpa mempengaruhi nilai lainnya. Misalnya seperti ini:
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());
}
Kami melakukan hal yang persis sama seperti pada contoh sebelumnya - kami mengurangi 2 bulan dari tanggal saat ini. Namun sekarang kodenya bekerja secara berbeda: bulannya berubah dari Januari ke November, namun tahunnya tetap sama seperti 2017! Kesimpulan:
Sat Nov 25 10:42:12 MSK 2017
Lebih jauh. Seperti yang kami katakan di atas, semua bidang suatu objek Calendar
dapat diperoleh secara terpisah. Metode ini bertanggung jawab untuk ini 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));
}
Kesimpulan:
Год: 2017
Месяц: 0
Порядковый номер недели в месяце: 4
Число: 25
Часы: 10
Минуты: 42
Секунды: 12
Миллисекунды: 0
Artinya, selain “super-setter” di kelas Calendar
juga ada “super-getter” :) Hal menarik lainnya tentu saja bekerja dengan era. Untuk membuat tanggal “BC” Anda perlu menggunakan field Calendar.Era
Misalnya, mari kita buat tanggal yang menunjukkan Pertempuran Cannae, di mana Hannibal mengalahkan tentara Roma. Ini terjadi pada tanggal 2 Agustus 216 SM. 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()));
}
Di sini kami menggunakan kelas SimpleDateFormat
untuk menampilkan tanggal dalam format yang lebih mudah kami pahami (huruf “GG” bertanggung jawab untuk menampilkan era). Kesimpulan:
02 авг 216 до н.э.
Calendar
Masih banyak lagi metode dan konstanta di kelas , baca tentangnya di dokumentasi:
Mengonversi string menjadi Tanggal
Untuk mengonversi String ke Tanggal, Anda dapat menggunakan kelas pembantu Java - SimpleDateFormat . Ini adalah kelas yang Anda perlukan untuk mengonversi tanggal ke format yang Anda tentukan. Pada gilirannya, ini sangat mirip dengan DateFormat . Satu-satunya perbedaan penting antara keduanya adalah SimpleDateFormat dapat digunakan untuk memformat (mengonversi tanggal menjadi string) dan menguraikan string menjadi tanggal yang sadar lokal, sedangkan DateFormat tidak mendukung lokal. Selain itu, DateFormat adalah kelas abstrak yang menyediakan dukungan dasar untuk memformat dan mengurai tanggal, sedangkan SimpleDateFormat adalah kelas konkret yang memperluas kelas DateFormat. Ini adalah contoh pembuatan objek SimpleDateFormat dan memformat Tanggal:SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);
System.out.println(formatter.format(date));
Pada contoh di atas kita menggunakan pola "yyyy-MM-dd HH:mm:ss" yang artinya:
- 4 digit tahun (yyyy);
- 2 digit untuk bulan (MM);
- 2 digit untuk hari (dd);
- 2 digit jam dalam format 24 jam (HH);
- 2 digit menit (mm);
- 2 digit untuk detik (ss).
2008-05-30 08:20:12
Ada cukup banyak template surat untuk kelas SimpleDateFormat . Agar Anda tidak bingung, kami telah mengumpulkannya dalam sebuah tabel:
Simbol | Keterangan | Contoh |
---|---|---|
G | era (dalam lokalisasi bahasa Inggris - AD dan SM) | IKLAN |
kamu | tahun (angka 4 digit) | 2020 |
Y y | tahun (2 digit terakhir) | 20 |
yyyy | tahun (angka 4 digit) | 2020 |
M | nomor bulan (tanpa angka nol di depan) | 8 |
MM | nomor bulan (dengan nol di depan jika nomor bulan < 10) | 04 |
MM | singkatan bulan tiga huruf (menurut lokalisasi) | Januari |
MMMM | nama bulan penuh | Juni |
w | minggu dalam setahun (tanpa angka nol di depan) | 4 |
ww | minggu dalam setahun (dengan angka nol di depan) | 04 |
W | minggu dalam bulan (tanpa angka nol di depan) | 3 |
WW | minggu dalam bulan (dengan awalan nol) | 03 |
D | hari dalam setahun | 67 |
D | hari dalam sebulan (tanpa angka nol di depan) | 9 |
DD | hari dalam sebulan (dengan angka nol di depannya) | 09 |
F | hari dalam seminggu dalam sebulan (tanpa angka nol di depan) | 9 |
FF | hari dalam seminggu dalam bulan (dengan nol di depan) | 09 |
E | hari dalam seminggu (singkatan) | W |
EEEE | hari dalam seminggu (penuh) | Jumat |
kamu | nomor hari dalam seminggu (tanpa angka nol di depan) | 5 |
kamu | nomor hari dalam seminggu (dengan nol di depan) | 05 |
A | Penanda AM/PM | SAYA. |
H | jam dalam format 24 jam tanpa angka nol di depannya | 6 |
HH | jam dalam format 24 jam dengan nol di depannya | 06 |
k | jumlah jam dalam format 24 jam | 18 |
K | jumlah jam dalam format 12 jam | 6 |
H | waktu dalam format 12 jam tanpa angka nol di depan | 6 |
hh | waktu dalam format 12 jam dengan nol di depannya | 06 |
M | menit tanpa angka nol di depannya | 32 |
mm | menit dengan nol di depannya | 32 |
S | detik tanpa angka nol di depannya | sebelas |
ss | detik dengan nol di depannya | sebelas |
S | milidetik | 297 |
z | Zona waktu | Eet |
Z | zona waktu dalam format RFC 822 | 300 |
Sampel | Contoh |
---|---|
hh-MM-tttt | 11-01-2020 |
yyyy-MM-dd | 01-10-2019 |
HH:mm:ss.SSS | 23:59.59.999 |
yyyy-MM-dd JJ:mm:ss | 30-11-2018 03:09:02 |
yyyy-MM-dd JJ:mm:ss.SSS | 01-03-2016 01:20:47.999 |
yyyy-MM-dd JJ:mm:ss.SSS Z | 13-13-2013 23:59:59.999 +0100 |
-
Buat baris dari mana Anda perlu mengatur tanggal:
String strDate = "Sat, April 4, 2020";
-
Kita membuat objek SimpleDateFormat baru dengan templat yang cocok dengan apa yang kita miliki di string (jika tidak, kita tidak akan dapat menguraikannya):
SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMMM d, yyyy", Locale.ENGLISH);
Seperti yang Anda lihat, kami memiliki argumen Lokal di sini. Jika kita hilangkan, maka akan menggunakan Lokal default, yang tidak selalu bahasa Inggris.
Jika lokal tidak cocok dengan string masukan, maka data string yang terikat ke bahasa tersebut, seperti milik kita Mon atau April , tidak akan dikenali dan akan memunculkan java.text.ParseException, meskipun polanya cocok.
Namun, kita tidak perlu menentukan formatnya jika kita menggunakan template yang tidak spesifik bahasa. Sebagai contoh - yyyy-MM-dd HH:mm:ss
-
Kami membuat tanggal menggunakan formatter, yang kemudian mem-parsingnya dari string input:
try { Date date = formatter.parse(strDate); System.out.println(date); } catch (ParseException e) { e.printStackTrace(); }
Keluaran konsol:
Sat Apr 04 00:00:00 EEST 2020
Hmm... Tapi formatnya sudah tidak sama lagi!
Untuk membuat format yang sama, kita menggunakan formatter lagi:
System.out.println(formatter.format(date));
Keluaran konsol:
Sat, April 4, 2020
SimpleDateFormat dan Kalender
SimpleDateFormat memungkinkan Anda memformat semua objek Tanggal dan Kalender yang Anda buat untuk digunakan nanti. Mari kita pertimbangkan hal menarik seperti bekerja dengan era. Untuk membuat tanggal “BC”, Anda perlu menggunakan kolom Calendar.Era. Misalnya, mari kita buat tanggal yang menunjukkan Pertempuran Cannae, di mana Hannibal mengalahkan tentara Roma. Ini terjadi pada tanggal 2 Agustus 216 SM. 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()));
}
Di sini kami menggunakan kelas SimpleDateFormat untuk menampilkan tanggal dalam format yang lebih mudah kami pahami (seperti yang ditunjukkan di atas, huruf “GG” bertanggung jawab untuk menampilkan era). Kesimpulan:
02 авг 216 до н.э.
Format Tanggal Jawa
Ini kasus lainnya. Anggaplah format tanggal ini tidak cocok untuk kita:
Sat Nov 25 10:42:12 MSK 2017
Jadi begini. Dengan menggunakan kemampuan kami dalam format tanggal java, Anda dapat mengubahnya sesuai keinginan Anda tanpa banyak kesulitan:
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()));
}
Kesimpulan:
суббота, 25 Ноябрь 2017
Jauh lebih baik, bukan? :)
GO TO FULL VERSION