Mengubah Tanggal Java satu jam mundur

124

Saya memiliki objek tanggal Java:

Date currentDate = new Date();

Ini akan memberikan tanggal dan waktu saat ini. Contoh:

Thu Jan 12 10:17:47 GMT 2012

Sebaliknya, saya ingin mendapatkan tanggalnya, mengubahnya menjadi satu jam yang lalu sehingga seharusnya memberi saya:

Thu Jan 12 09:17:47 GMT 2012

Apa cara terbaik untuk melakukannya?

Makky
sumber
apakah ada mktimepadanannya di java? kurangi 60 menit darinya?
Shiplu Mokaddim

Jawaban:

243

java.util.Calendar

Calendar cal = Calendar.getInstance();
// remove next line if you're always using the current time.
cal.setTime(currentDate);
cal.add(Calendar.HOUR, -1);
Date oneHourBack = cal.getTime();

java.util.Date

new Date(System.currentTimeMillis() - 3600 * 1000);

org.joda.time.LocalDateTime

new LocalDateTime().minusHours(1)

Java 8: java.time.LocalDateTime

LocalDateTime.now().minusHours(1)

Java 8 java.time.Instant

// always in UTC if not timezone set
Instant.now().minus(1, ChronoUnit.HOURS));
// with timezone, Europe/Berlin for example
Instant.now()
       .atZone(ZoneId.of("Europe/Berlin"))
       .minusHours(1));
Kimi
sumber
8
Hanya berbeda dari fakta bahwa ada Calendar.HOUR yang bekerja dengan jam 12 jam dan Calendar.HOUR_OF_DAY untuk 24 jam: chintat.blogspot.ca/2006/05/…
Wolf
Akankah solusi pertama dengan Kalender berfungsi jika waktunya tengah malam pada suatu hari dan Anda ingin satu jam lebih awal yaitu 11 malam pada hari sebelumnya?
George Arokiam
1
@GeorgeArokiam ya itu akan
Kimi
66

Mirip dengan solusi @Sumit Jain

Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);

atau

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));
Peter Lawrey
sumber
3
Solusi yang jauh lebih baik. Pembuatan instance kalender tampaknya berlebihan dalam aplikasi khusus ini.
www.Decompiler.com
2
@cosmolev Kalender berlebihan dalam banyak contoh yang saya temukan.
Peter Lawrey
2
@Stoan Saya telah menambahkan contoh yang lebih mudah dibaca. Anda harus mencatat bahwa Kalender sangat tidak efisien.
Peter Lawrey
@ PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); Ini harus 10 menit di belakang?
Siya Sosibo
15

tl; dr

Dalam UTC :

Instant.now().minus( 1 , ChronoUnit.HOURS ) 

Atau, dikategorikan:

Instant.now()
       .atZone( ZoneId.of ( "America/Montreal" ) )
       .minusHours( 1 )

Menggunakan java.time

Java 8 dan yang lebih baru memiliki framework java.time baru bawaan .

Instant

Jika Anda hanya peduli tentang UTC (GMT), maka gunakan Instantkelas tersebut.

Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );

Buang ke konsol.

System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );

instan: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z

Perhatikan bagaimana saat ini terjadi melewatkan kembali ke tanggal kemarin.

ZonedDateTime

Jika Anda peduli dengan zona waktu, gunakan ZonedDateTimekelas. Anda dapat memulai dengan Sekejap dan menetapkan zona waktu, ZoneIdobjek. Kelas ini menangani penyesuaian yang diperlukan untuk anomali seperti Daylight Saving Time (DST) .

Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );

Buang ke konsol.

System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );

instan: 2015-10-29T00: 50: 30.778Z

zdt: 2015-10-28T20: 50: 30.778-04: 00 [Amerika / Montreal]

zdtHourEarlier: 2015-10-28T19: 50: 30.778-04: 00 [Amerika / Montreal]

Konversi

Kelas java.util.Date/.Calendar lama sekarang sudah ketinggalan zaman. Hindari mereka. Mereka terkenal merepotkan dan membingungkan.

Jika Anda harus menggunakan kelas lama untuk beroperasi dengan kode lama yang belum diperbarui untuk jenis java.time, panggil metode konversi. Berikut adalah contoh kode dari Instan atau ZonedDateTime ke java.util.Date.

java.util.Date date = java.util.Date.from( instant );

…atau…

java.util.Date date = java.util.Date.from( zdt.toInstant() );

Tentang java.time

The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date, Calendar, &SimpleDateFormat .

Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .

Anda dapat bertukar objek java.time langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu string, tidak perlu java.sql.*kelas.

Di mana mendapatkan kelas java.time?

Proyek ThreeTen-Extra memperluas java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan java.time di masa mendatang. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .

Basil Bourque
sumber
Halo Pak, saya masih belum bisa menemukan cara yang tepat untuk membuat "waktu yang lalu" untuk Instan.
Ticherhaz
9

Gunakan Kalender .

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);
adarshr
sumber
7

Atau menggunakan perpustakaan Joda Time yang terkenal :

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();
Jean Logeart
sumber
5

Kurangi saja jumlah milidetik dalam satu jam dari tanggal tersebut.

currentDate.setTime(currentDate.getTime() - 3600 * 1000));

Sumit Jain
sumber
4

Anda dapat menggunakan dari kode di bawah ini untuk tanggal dan waktu:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
       //get current date time with Calendar()
       Calendar cal = Calendar.getInstance();
       System.out.println("Current Date Time : " + dateFormat.format(cal.getTime()));

       cal.add(Calendar.DATE, 1);
       System.out.println("Add one day to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, 1);
       System.out.println("Add one month to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, 1);
       System.out.println("Add one year to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, 1);
       System.out.println("Add one hour to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, 1);
       System.out.println("Add one minute to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, 1);
       System.out.println("Add one second to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.DATE, -1);
       System.out.println("Subtract one day from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, -1);
       System.out.println("Subtract one month from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, -1);
       System.out.println("Subtract one year from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, -1);
       System.out.println("Subtract one hour from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, -1);
       System.out.println("Subtract one minute from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, -1);
       System.out.println("Subtract one second from current date : " + dateFormat.format(cal.getTime()));

Keluaran:

Current Date Time : 2008/12/28 10:24:53
Add one day to current date : 2008/12/29 10:24:53
Add one month to current date : 2009/01/28 10:24:53
Add one year to current date : 2009/12/28 10:24:53
Add one hour to current date : 2008/12/28 11:24:53
Add one minute to current date : 2008/12/28 10:25:53
Add one second to current date : 2008/12/28 10:24:54
Subtract one day from current date : 2008/12/27 10:24:53
Subtract one month from current date : 2008/11/28 10:24:53
Subtract one year from current date : 2007/12/28 10:24:53
Subtract one hour from current date : 2008/12/28 09:24:53
Subtract one minute from current date : 2008/12/28 10:23:53
Subtract one second from current date : 2008/12/28 10:24:52

Tautan ini bagus: Lihat di sini

Dan lihat: Lihat juga

Dan: Sini

Dan: Sini

Dan: Sini

Jika Anda hanya membutuhkan waktu:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

sumber
2
FYI: Answer ini menggunakan class Date-time lama yang merepotkan yang sekarang sudah lama, digantikan oleh class java.time modern.
Basil Bourque
0

Ini bisa dicapai dengan menggunakan java.util.Date. Kode berikut akan mengurangi 1 jam dari tanggal Anda.

Date date = new Date(yourdate in date format);
Date newDate = DateUtils.addHours(date, -1)

Demikian pula untuk mengurangi 20 detik dari tanggal Anda

newDate = DateUtils.addSeconds(date, -20)    
Dhananjay
sumber
-1

Dapatkan waktu dalam milidetik, dikurangi menit Anda dalam milidetik dan konversikan ke Tanggal. Di sini Anda perlu merealisasikannya !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);
Puncak
sumber
@ Makky: Saya tahu banyak hal telah berubah. Tapi itu bukan jawaban yang salah !!! Mengapa Anda memberi tahu ini jawaban yang salah? Apakah Anda melihat jawaban yang diterima sepenuhnya?
Zenith
1
Mengapa Anda bahkan menjawab pertanyaan yang berusia 5 tahun dan telah menerima jawaban.
Makky
Jawaban ini tidak memberikan nilai di luar Jawaban tahun-tahun yang ada. Dan Jawaban ini secara tidak bijaksana menggunakan kelas tanggal-waktu lama yang mengerikan yang telah digantikan selama bertahun-tahun oleh kelas java.time. Masalah lain: Jawaban ini mengabaikan masalah zona waktu, dan menunjukkan kode yang akan menggunakan zona waktu default JVM saat ini sementara Pertanyaan menanyakan GMT / UTC. Lihat bagian selanjutnya dari Jawaban yang benar oleh Kimi atau lihat Jawaban saya untuk pembahasan lebih lanjut.
Basil Bourque
-1

Ini bekerja untuk saya daripada menggunakan format. Untuk bekerja dengan waktu, cukup gunakan metode parse dan toString ()

String localTime = "6:11"; LocalTime localTime = LocalTime.parse (waktu lokal)

LocalTime lt = 6:11; localTime = lt.toString ()

Shahid Hussain Abbasi
sumber
1
Jawaban ini tidak membahas Pertanyaan tersebut. Pertanyaannya adalah tentang lebih dari satu waktu dalam sehari.
Basil Bourque