Soru Java'da bir tarihe n saat eklemek?


Bir Date nesnesine n saati nasıl eklerim? StackOverflow'taki günleri kullanarak başka bir örnek buldum, ancak hala saatlerce nasıl yapıldığını anlamıyorum.


115
2017-08-27 04:07


Menşei


kullanım joda-time.sourceforge.net, Eğer mümkünse. - Babar
kullanım Java 8 Tarihi ve mümkünse. - peceps
@Babar FYI, Joda-Time proje şu an Bakım Modu, ekibin java.time sınıflar. Görmek Oracle tarafından eğitim. - Basil Bourque


Cevaplar:


Takvim sınıfını kontrol et. O var add zaman manipülasyonuna izin veren yöntem (ve bazı diğerleri). Böyle bir şey işe yaramalı.

    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, one hour in the future

Kontrol API daha fazlası için.


183
2017-08-27 04:11



Sadece yaz saati / yaz saati ile uğraşıyorsanız dikkatli olun. - CurtainDog
"Negatif saatler" ekleyebileceğine söz vermeksizin - pramodc84
@CurtainDog Kullanarak Calendar.add() bunu otomatik olarak halleder. - Jesper
cal.setTime (new Date ()) gerekli değildir - Calendar.getInstance () javadoc der ki: "Dönen Takvim varsayılan saat diliminde varsayılan yerel zamana göre geçerli zamana dayanır." - mithrandir
FYI, zahmetli eski tarih-zaman sınıfları gibi java.util.Date, java.util.Calendar, ve java.text.SimpleDateFormat şimdi mirastarafından java.time Java 8 ve Java 9'da yerleşik sınıflar. Bkz. Eğitimi Oracle tarafından. - Basil Bourque


Eğer kullanırsan Apache Commons / Lang, kullanarak tek adımda yapabilirsiniz DateUtils.addHours():

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

(Orijinal nesne değişmemiş)


64
2017-08-27 04:40



Negativ Saatleri de kullanabilirsiniz: DateUtils.addHours(oldDate, -1); - Kaptain
Sahnelerin ardında, bu tam olarak Nikita'nın cevabını yapıyor, ama bu çok basit ve okunması kolay. Artı, zaten Apache Commons / Lang kullanıyorsanız ... neden olmasın? - Matt


Christopher'ın örneğini basitleştirmek için.

Sabit olduğunu söyle

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

Yazabilirsin.

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

Eğer kullanırsan uzun Tarih nesnesi yerine tarih / saat saklamak için yapabileceğiniz

long newDate = oldDate + 2 * HOUR;

25
2017-08-27 22:06





İle Joda-Time

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);

23
2017-08-27 05:18



Bunun için +1 gereksiz, ancak daha fazla tarih manipülasyonu yapacaksanız, joda zamanı harika bir kütüphanedir. - Joeri Hendrickx
@JoeriHendrickx Programcı bir tarihe saat ekliyorsa, o zaman çok Muhtemelen başka tarih çalışmalarını yapıyorlar. Ben düşünmüyorum Joda-Time hiç gereksiz; Yeni bir proje kurarken yaptığım ilk şey Joda-Time'ı eklemektir. Sun ve Oracle bile eski java.util.Date & Calendar'ın aşamalı olarak kaldırılması gerektiğine karar verdiler. java.time. * paket (Joda-Time'dan esinlenerek) Java 8'e. - Basil Bourque
Android'de Joda ile sorun yaşadım. Başlarken ClassNotDefinedException - TheRealChx101


tl; Dr.

myJavaUtilDate.toInstant()
              .plusHours( 8 )

Veya…

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.

Java.time kullanarak

Java.time framework, Java 8 ve daha sonra eski Java.util.Date/.Calendar sınıflarını tamamlar. Bu eski sınıflar çirkin bir şekilde zahmetli. Onları kaçının.

Kullan toInstant java.util.Date'e yeni türden yeni java.time türüne dönüştürülecek yöntem. bir Instant zaman çizgisinde bir an UTC bir karar ile nanosaniye.

Instant instant = myUtilDate.toInstant();

Buna saat ekleyebilirsin Instant geçerek TemporalAmount gibi Duration.

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

Bu tarih-zamanı okumak için, arayarak standart ISO 8601 biçiminde bir String oluşturun toString.

String output = instantHourLater.toString();

Bu anı, bazı bölgelerin duvar saati zamanı. Ayarlamak Instant İstediğiniz / beklenen saat diliminize ZonedDateTime.

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

Alternatif olarak, arayabilirsiniz plusHours saat sayınızı eklemek için. İmarlı olmak, gün ışığından yararlanma saati (DST) ve diğer anormallikler sizin adınıza ele alınacaktır.

ZonedDateTime later = zdt.plusHours( 8 );

Dahil olmak üzere eski tarih-zaman sınıflarını kullanmaktan kaçınmalısınız java.util.Date ve .Calendar. Ama gerçekten ihtiyacınız varsa java.util.Date java.time türleri için henüz güncellenmemiş sınıflarla birlikte çalışabilirlik için ZonedDateTime üzerinden Instant. Eski sınıflara eklenen yeni yöntemler, java.time türlerine dönüşümü kolaylaştırır.

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

Dönüştürme hakkında daha fazla tartışma için bkz. cevabım soruya, Java.util.Date'i “java.time” türüne dönüştürün mü?.


hakkında java.time

java.time çerçeve Java 8 ve daha sonra yerleşiktir. Bu dersler sıkıntılı eskileri destekliyor miras gibi tarih-saat sınıfları java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time proje, şimdi Bakım Modu, geçişi önerir java.time sınıflar.

Daha fazla bilgi için bkz. Oracle Eğitimi. Ve birçok örnek ve açıklamalar için Stack Overflow'u arayın. Şartname JSR 310.

Değişebilir java.time doğrudan veritabanınızla nesneler. Kullanın JDBC sürücüsü ile uyumlu JDBC 4.2 veya daha sonra. Dizelere gerek yok, gerek yok java.sql.* sınıflar.

Java.time sınıflarını nereden edinebilirim?

ThreeTen-Ekstra Proje java.time ek sınıfları ile genişletir. Bu proje java.time için gelecekteki olası eklemeler için kanıtlanmış bir zemin. Burada bazı yararlı sınıflar bulabilirsiniz. Interval, YearWeek, YearQuarter, ve Daha.


20
2017-10-08 16:27





Java 8'den beri:

LocalDateTime.now().minusHours(1);

Görmek LocalDateTime API.


19
2018-02-12 23:48



Yakın ama çok doğru değil. Bir tane için gitmelisin ZonedDateTime yerine bir LocalDateTime. "Yerel" anlamına gelir değil belirli bir yere bağlı ve değil zaman çizelgesine bağlı. "Noel, 25 Aralık 2015'te gece yarısında başlıyor" gibi, zaman diliminde belirli bir anı elde etmek için belirli bir zaman dilimini uygulayana kadar, farklı saat dilimlerinde farklı bir an. Ayrıca, bir zaman dilimi olmadan Gün Işığı Tasarrufu Zamanı (DST) ve diğer anomaliler LocalDateTime'ın bu kullanımı ile ele alınmayacaktır. Görmek cevabımkıyasla. - Basil Bourque
Ayrıca almak için java.util.Date talep eden kişi bize sormuştu ZonedDateTime.toInstant() ve Date.from() burada açıklandığı gibi stackoverflow.com/a/32274725/5661065 - hayduke


Gibi bir şey:

Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() + 
                        (2L * hoursInMillis)); // Adds 2 hours

13
2017-08-27 05:46



FYI, zahmetli eski tarih-zaman sınıfları gibi java.util.Date, java.util.Calendar, ve java.text.SimpleDateFormat şimdi mirastarafından java.time Java 8 ve Java 9'da yerleşik sınıflar. Bkz. Eğitimi Oracle tarafından. - Basil Bourque


Newish kullanarak java.util.concurrent.TimeUnit sınıf bunu böyle yapabilirsin

    Date oldDate = new Date(); // oldDate == current time
    Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours

11
2017-10-15 23:41