Menambahkan n jam ke tanggal di Jawa?

141

Bagaimana cara menambahkan n jam ke objek Tanggal? Saya menemukan contoh lain yang menggunakan hari di StackOverflow, tetapi masih tidak mengerti cara melakukannya dengan jam.

Jorge Lainfiesta
sumber
3
Gunakan joda-time.sourceforge.net , jika memungkinkan.
Babar
3
Gunakan Tanggal dan Waktu Java 8 jika memungkinkan.
peceps
@Babar FYI, proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time . Lihat Tutorial oleh Oracle .
Basil Bourque

Jawaban:

217

Periksa Calendarkelas. Ia memiliki addmetode (dan beberapa lainnya) untuk memungkinkan manipulasi waktu.

Sesuatu seperti ini seharusnya bekerja:

Calendar cal = Calendar.getInstance(); // creates calendar
cal.setTime(new Date());               // sets calendar time/date
cal.add(Calendar.HOUR_OF_DAY, 1);      // adds one hour
cal.getTime();                         // returns new date object plus one hour

Periksa API untuk lebih lanjut.

Nikita Rybak
sumber
4
Berhati-hatilah jika Anda berurusan dengan penghematan siang hari / waktu musim panas.
CurtainDog
6
Tak perlu disebutkan, Anda dapat menambahkan "jam negatif"
pramodc84
6
@CurtainDog Menggunakan Calendar.add()menangani itu secara otomatis.
Jesper
6
cal.setTime (new Date ()) tidak diperlukan - javadoc dari Calendar.getInstance () mengatakan: "Kalender yang dikembalikan didasarkan pada waktu saat ini di zona waktu default dengan lokal default."
mithrandir
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .
Basil Bourque
87

Jika Anda menggunakan Apache Commons / Lang , Anda dapat melakukannya dalam satu langkah menggunakan DateUtils.addHours():

Date newDate = DateUtils.addHours(oldDate, 3);

(Objek asli tidak berubah)

Sean Patrick Floyd
sumber
3
Anda juga dapat menggunakan Jam negatif:DateUtils.addHours(oldDate, -1);
Kaptain
Di balik layar, ini persis seperti yang dilakukan jawaban Nikita, tetapi ini sangat sederhana dan mudah dibaca. Ditambah lagi, jika Anda sudah menggunakan Apache Commons / Lang ... kenapa tidak?
Matt
30

Untuk menyederhanakan contoh @ Christopher.

Katakanlah Anda memiliki konstanta

public static final long HOUR = 3600*1000; // in milli-seconds.

Kamu bisa menulis.

Date newDate = new Date(oldDate.getTime() + 2 * HOUR);

Jika Anda menggunakan long untuk menyimpan tanggal / waktu daripada objek Tanggal, Anda dapat melakukannya

long newDate = oldDate + 2 * HOUR;
Peter Lawrey
sumber
28

tl; dr

myJavaUtilDate.toInstant()
              .plusHours( 8 )

Atau…

myJavaUtilDate.toInstant()                // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
              .plus(                      // Do the math, adding a span of time to our moment, our `Instant`. 
                  Duration.ofHours( 8 )   // Specify a span of time unattached to the timeline.
               )                          // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.

Menggunakan java.time

Framework java.time dibangun ke dalam Java 8 dan yang lebih baru menggantikan kelas Java.util.Date/.Calendar lama. Kelas-kelas lama itu terkenal merepotkan. Hindari mereka.

Gunakan toInstantmetode yang baru ditambahkan ke java.util.Date untuk mengonversi dari tipe lama ke tipe java.time baru. Sebuah Instantmomen di garis waktu dalam UTC dengan resolusi nanodetik .

Instant instant = myUtilDate.toInstant();

Anda dapat menambahkan jam ke jam itu Instantdengan melewatkan TemporalAmountseperti Duration.

Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );

Untuk membaca tanggal-waktu tersebut, buat String dalam format ISO 8601 standar dengan memanggil toString.

String output = instantHourLater.toString();

Anda mungkin ingin melihat momen itu melalui lensa waktu jam dinding suatu daerah . Sesuaikan dengan Instantzona waktu yang Anda inginkan / diharapkan dengan membuat ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Atau, Anda dapat menelepon plusHoursuntuk menambahkan hitungan jam Anda. Menjadi zona berarti Daylight Saving Time (DST) dan anomali lainnya akan ditangani atas nama Anda.

ZonedDateTime later = zdt.plusHours( 8 );

Anda harus menghindari penggunaan kelas tanggal-waktu lama termasuk java.util.Datedan .Calendar. Tetapi jika Anda benar-benar membutuhkan java.util.Dateinteroperabilitas dengan kelas yang belum diperbarui untuk tipe java.time, konversikan dari ZonedDateTimevia Instant. Metode baru yang ditambahkan ke kelas lama memfasilitasi konversi ke / dari tipe java.time.

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

Untuk diskusi lebih lanjut tentang konversi, lihat Jawaban saya untuk Pertanyaan, Konversi java.util.Date menjadi tipe "java.time" apa? .


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.

Dimana 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
23

Dengan Joda-Time

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
Babar
sumber
2
+1 agak tidak diperlukan untuk ini, tetapi jika Anda akan melakukan lebih banyak manipulasi tanggal, joda time adalah perpustakaan yang hebat
Joeri Hendrickx
3
@JoeriHendrickx Jika programmer menambahkan jam untuk kencan, maka sangat besar kemungkinan mereka melakukan pekerjaan tanggal-waktu lainnya. Saya sama sekali tidak menganggap Joda-Time tidak perlu; hal pertama yang saya lakukan saat menyiapkan proyek baru adalah menambahkan Joda-Time. Bahkan Sun dan Oracle setuju bahwa java.util.Date & Calendar lama perlu dihapus, jadi mereka menambahkan paket java.time. * Baru (terinspirasi oleh Joda-Time) ke Java 8.
Basil Bourque
Saya mengalami masalah dengan Joda di android. Terus mendapatkanClassNotDefinedException
TheRealChx101
23

Sejak Java 8:

LocalDateTime.now().minusHours(1);

Lihat LocalDateTimeAPI .

leventov.dll
sumber
4
Dekat tapi kurang tepat. Anda harus memilih a ZonedDateTimedaripada LocalDateTime. "Lokal" berarti tidak terikat pada lokalitas tertentu, dan tidak terikat pada garis waktu. Seperti "Natal dimulai pada tengah malam pada 25 Desember 2015" adalah momen yang berbeda di berbagai zona waktu, tanpa arti sampai Anda menerapkan zona waktu tertentu untuk mendapatkan momen tertentu pada garis waktu. Selain itu, tanpa zona waktu Daylight Saving Time (DST) dan anomali lainnya tidak akan ditangani dengan penggunaan LocalDateTime tersebut. Lihat Jawaban saya sebagai perbandingan.
Basil Bourque
1
Juga untuk mendapatkan java.util.Dateobjek seperti yang diminta pemohon kepada kami ZonedDateTime.toInstant()dan Date.from()seperti yang dijelaskan di sini stackoverflow.com/a/32274725/5661065
hayduke
16

Menggunakan kelas java.util.concurrent.TimeUnit yang baru, Anda dapat melakukannya seperti ini

Date oldDate = new Date(); // oldDate == current time
Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Add 2 hours
Iain
sumber
14

Sesuatu seperti:

Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() + 
                        (2L * hoursInMillis)); // Adds 2 hours
Christopher Hunt
sumber
1
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .
Basil Bourque
7

Ini adalah bagian kode lain saat Dateobjek Anda dalam format Datetime. Keindahan dari kode ini adalah, Jika Anda memberikan lebih banyak jam, tanggal juga akan diperbarui.

    String myString =  "09:00 12/12/2014";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy");
    Date myDateTime = null;

    //Parse your string to SimpleDateFormat
    try
      {
        myDateTime = simpleDateFormat.parse(myString);
      }
    catch (ParseException e)
      {
         e.printStackTrace();
      }
    System.out.println("This is the Actual Date:"+myDateTime);
    Calendar cal = new GregorianCalendar();
    cal.setTime(myDateTime);

    //Adding 21 Hours to your Date
    cal.add(Calendar.HOUR_OF_DAY, 21);
    System.out.println("This is Hours Added Date:"+cal.getTime());

Berikut adalah Outputnya:

    This is the Actual Date:Fri Dec 12 09:00:00 EST 2014
    This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014
vkrams
sumber
1
Anda juga bisa menggunakan: Calendar cal = Calendar.getInstance ();
Stefan Sprenger
4
Date argDate = new Date(); //set your date.
String argTime = "09:00"; //9 AM - 24 hour format :- Set your time.
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
String dateTime = sdf.format(argDate) + " " + argTime;
Date requiredDate = dateFormat.parse(dateTime);
hantu pengendara
sumber
4

Jika Anda ingin menggunakan java.time, berikut adalah metode untuk menambahkan durasi berformat ISO 8601:

import java.time.Duration;
import java.time.LocalDateTime;

...

LocalDateTime yourDate = ...

...

// Adds 1 hour to your date.

yourDate = yourDate.plus(Duration.parse("PT1H")); // Java.
// OR
yourDate = yourDate + Duration.parse("PT1H"); // Groovy.  
Daniel
sumber
1
Duration.parse(iso8601duration)adalah menarik, terima kasih, tetapi Anda tidak dapat menggunakan operator +pada LocalDateTime, Anda mungkin ingin mengedit itu. Tapi .plus(...)berhasil.
qlown
Terima kasih @qlown, saya rasa + berfungsi dengan baik karena itulah cara saya menggunakannya sekarang. Saya akan mengubah jawaban yang sesuai.
Daniel
Pertanyaannya adalah tentang suatu Dateobjek, yang mewakili momen tertentu dalam UTC. Penggunaan Anda LocalDateTimegagal untuk menjawab Pertanyaan tersebut. LocalDateTimetidak memiliki konsep zona waktu atau offset-dari-UTC, dan oleh karena itu tidak dapat mewakili momen. Kelas yang salah untuk masalah ini. Lihat Apa perbedaan antara Instant dan LocalDateTime?
Basil Bourque
DateObjek @BasilBourque tidak digunakan lagi. Pertanyaannya ambigu jika menyangkut zona waktu, jadi jawaban saya berlaku. Selain itu, Anda hanya dapat swap keluar LocalDateTimeuntuk ZonedDateTime.
Daniel
4

Anda dapat melakukannya dengan Joda DateTime API

DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
Tikus
sumber
Bekerja setelah saya mengubah baris pertama menjadi DateTime dateTime = new DateTime (dateObj);
Sundararaj Govindasamy
1

dengan menggunakan kelas Java 8. kita dapat memanipulasi tanggal dan waktu dengan sangat mudah seperti di bawah ini.

LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);
Abdul Gafoor
sumber
Pertanyaannya adalah tentang suatu Dateobjek, yang mewakili momen tertentu dalam UTC. Penggunaan Anda LocalDateTimegagal untuk menjawab Pertanyaan tersebut. LocalDateTimetidak memiliki konsep zona waktu atau offset-dari-UTC, dan oleh karena itu tidak dapat mewakili momen. Kelas yang salah untuk masalah ini. Lihat Apa perbedaan antara Instant dan LocalDateTime?
Basil Bourque
0

Anda dapat menggunakan kelas LocalDateTime dari Java 8. Misalnya:

long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
Sajit Gupta
sumber
1
Pertanyaannya adalah tentang suatu Dateobjek, yang mewakili momen tertentu dalam UTC. Penggunaan Anda LocalDateTimegagal untuk menjawab Pertanyaan tersebut. LocalDateTimetidak memiliki konsep zona waktu atau offset-dari-UTC, dan oleh karena itu tidak dapat mewakili momen. Kelas yang salah untuk masalah ini. Lihat Apa perbedaan antara Instant dan LocalDateTime?
Basil Bourque
-2

Anda dapat menggunakan metode ini, Sangat mudah untuk dipahami dan diterapkan:

public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, nombreHeure);
    calendar.add(Calendar.MINUTE, nombreMinute);
    calendar.add(Calendar.SECOND, nombreSeconde);
    return calendar.getTime();
}
Nimpo
sumber
1
Pendekatan ini telah disajikan dalam Jawaban lain yang diposting beberapa tahun yang lalu. Saya tidak melihat bagaimana yang satu ini menambah nilai lagi.
Basil Bourque
Nilai tambah dari proposal saya adalah kesederhanaan dan kemudahan implementasi, pengguna hanya perlu menempelkannya dan menggunakannya dan menambahkan jam, menit atau detik, seperti yang Anda ketahui, level Pemula berbeda dan jika jawaban yang diajukan menggabungkan antara jawaban sederhana dan jawaban lanjutan akan sangat berarti :)
Nimpo