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.
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
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."
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
publicstaticfinallong 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
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.
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.
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 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.
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 .
+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
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
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 SimpleDateFormattry
{
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 1209:00:00 EST 2014
This is Hours Added Date:Sat Dec 1306:00:00 EST 2014
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);
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();
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));
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:
publicstatic 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();
}
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 :)
Jawaban:
Periksa
Calendar
kelas. Ia memilikiadd
metode (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.
sumber
Calendar.add()
menangani itu secara otomatis.java.util.Date
,java.util.Calendar
, danjava.text.SimpleDateFormat
sekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .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)
sumber
DateUtils.addHours(oldDate, -1);
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;
sumber
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
toInstant
metode yang baru ditambahkan ke java.util.Date untuk mengonversi dari tipe lama ke tipe java.time baru. SebuahInstant
momen di garis waktu dalam UTC dengan resolusi nanodetik .Anda dapat menambahkan jam ke jam itu
Instant
dengan melewatkanTemporalAmount
sepertiDuration
.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
.Anda mungkin ingin melihat momen itu melalui lensa waktu jam dinding suatu daerah . Sesuaikan dengan
Instant
zona waktu yang Anda inginkan / diharapkan dengan membuatZonedDateTime
.ZoneId zoneId = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Atau, Anda dapat menelepon
plusHours
untuk 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.Date
dan.Calendar
. Tetapi jika Anda benar-benar membutuhkanjava.util.Date
interoperabilitas dengan kelas yang belum diperbarui untuk tipe java.time, konversikan dariZonedDateTime
viaInstant
. Metode baru yang ditambahkan ke kelas lama memfasilitasi konversi ke / dari tipe java.time.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 .sumber
Dengan Joda-Time
DateTime dt = new DateTime(); DateTime added = dt.plusHours(6);
sumber
ClassNotDefinedException
Sejak Java 8:
LocalDateTime.now().minusHours(1);
Lihat
LocalDateTime
API .sumber
ZonedDateTime
daripadaLocalDateTime
. "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.java.util.Date
objek seperti yang diminta pemohon kepada kamiZonedDateTime.toInstant()
danDate.from()
seperti yang dijelaskan di sini stackoverflow.com/a/32274725/5661065Menggunakan 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
sumber
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
sumber
java.util.Date
,java.util.Calendar
, danjava.text.SimpleDateFormat
sekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .Ini adalah bagian kode lain saat
Date
objek 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
sumber
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);
sumber
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.
sumber
Duration.parse(iso8601duration)
adalah menarik, terima kasih, tetapi Anda tidak dapat menggunakan operator+
padaLocalDateTime
, Anda mungkin ingin mengedit itu. Tapi.plus(...)
berhasil.Date
objek, yang mewakili momen tertentu dalam UTC. Penggunaan AndaLocalDateTime
gagal untuk menjawab Pertanyaan tersebut.LocalDateTime
tidak 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?Date
Objek @BasilBourque tidak digunakan lagi. Pertanyaannya ambigu jika menyangkut zona waktu, jadi jawaban saya berlaku. Selain itu, Anda hanya dapat swap keluarLocalDateTime
untukZonedDateTime
.Anda dapat melakukannya dengan Joda DateTime API
DateTime date= new DateTime(dateObj); date = date.plusHours(1); dateObj = date.toDate();
sumber
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);
sumber
Date
objek, yang mewakili momen tertentu dalam UTC. Penggunaan AndaLocalDateTime
gagal untuk menjawab Pertanyaan tersebut.LocalDateTime
tidak 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?Anda dapat menggunakan kelas LocalDateTime dari Java 8. Misalnya:
long n = 4; LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime.plusHours(n));
sumber
Date
objek, yang mewakili momen tertentu dalam UTC. Penggunaan AndaLocalDateTime
gagal untuk menjawab Pertanyaan tersebut.LocalDateTime
tidak 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?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(); }
sumber