Java'da bir tarihe n saat mi ekliyorsunuz?


136

Bir Date nesnesine n saati nasıl eklerim? StackOverflow gün kullanarak başka bir örnek buldum, ama yine de nasıl saat ile yapmak anlamıyorum.


3
Mümkünse joda-time.sourceforge.net adresini kullanın .
Babar

3
Kullanım Java 8 Tarih ve Saat mümkünse.
Ağustos'ta

@Babar FYI, Joda-Time projesi şu anda bakım modunda ve ekip java.time sınıflarına geçişi tavsiye ediyor . Oracle'ın Öğreticisine bakın .
Basil Bourque

Yanıtlar:


210

Takvim sınıfını kontrol edin. Bu sahip addzaman işleme izin vermek için bir yöntem (ve 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

Daha fazla bilgi için API'yı kontrol edin .


4
Yaz saati / yaz saati ile uğraşıyorsanız dikkatli olun.
CurtainDog

5
Tabii ki "negatif saat" ekleyebilirsiniz
pramodc84

6
@CurtainDog Kullanma Calendar.add()bunu otomatik olarak halleder.
Jesper

6
cal.setTime (new Date ()) gerekli değildir - Calendar.getInstance () javadocu: "Döndürülen Takvim, varsayılan yerel ayara sahip varsayılan saat dilimindeki geçerli saate dayanır."
mithrandir

Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time Java 8 ve Java 9. Bkz yerleşik sınıflara Öğreticisi Oracle tarafından .
Basil Bourque

82

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

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

(Orijinal nesne değişmez)


3
Negativ saatlerini de kullanabilirsiniz:DateUtils.addHours(oldDate, -1);
Kaptain

Perde arkasında, Nikita'nın cevabı tam olarak bunu yapıyor, ancak bu çok basit ve okunması kolay. Artı, zaten Apache Commons / Lang kullanıyorsanız ... neden olmasın?
Matt

28

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

Sabitin olduğunu söyle

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

Yazabilirsin.

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

Date nesnesi yerine tarih / saat depolamak için uzun kullanırsanız,

long newDate = oldDate + 2 * HOUR;

27

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 kullanma

Java 8 ve sonraki sürümlerinde yerleşik java.time çerçevesi eski Java.util.Date/.Calendar sınıflarını tamamlar. Bu eski sınıflar çok zahmetlidir. Onlardan kaçının.

toInstantEski türden yeni java.time türüne dönüştürmek için java.util.Date'e yeni eklenen yöntemi kullanın . Bir Instantde zaman tablosunda bir andır UTC çözünürlüğe sahip nanosaniye .

Instant instant = myUtilDate.toInstant();

Bunu saat ekleyebilir Instantbir ileterek TemporalAmountgibi Duration.

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

Bu tarih saatini okumak için arayarak standart ISO 8601 biçiminde bir Dize oluşturun toString.

String output = instantHourLater.toString();

O anı bir bölgenin duvar saati zamanının merceğinden görmek isteyebilirsiniz . A Instantoluşturarak istediğiniz / beklenen zaman dilimine ayarlayın ZonedDateTime.

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

Alternatif olarak, plusHourssaat sayınızı eklemek için arayabilirsiniz . İmar edilmiş olmak, Yaz Saati Uygulaması (DST) ve diğer anormalliklerin sizin adınıza ele alınacağı anlamına gelir.

ZonedDateTime later = zdt.plusHours( 8 );

java.util.DateVe dahil olmak üzere eski tarih-saat sınıflarını kullanmaktan kaçınmalısınız .Calendar. Ancak java.util.Date, java.time türleri için henüz güncellenmemiş sınıflarla birlikte çalışabilirlik için gerçekten ihtiyacınız varsa , ZonedDateTimearacılığıyla dönüştürün Instant. Eski sınıflara eklenen yeni yöntemler, java.time türlerine / türlerinden dönüştürmeyi kolaylaştırır.

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

Dönüştürme konusunda daha fazla tartışma için, bkz benim cevap , soru neyi “java.time” türüne java.util.Date dönüştürme? .


Hakkında java.time

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar& SimpleDateFormat.

Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .

Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Özellikler JSR 310 .

Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya sonraki bir sürümüyle uyumlu bir JDBC sürücüsü kullanın . Dizeye gerek yok, gerek yokjava.sql.* sınıflara .

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

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


23

İle Joda-Time

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

2
Bunun için +1 biraz gereksiz, ancak daha fazla tarih manipülasyonu yapacaksanız, joda zamanı harika bir kütüphane
Joeri Hendrickx

3
@JoeriHendrickx Programcı bir tarihe saat ekliyorsa, büyük olasılıkla başka bir tarih-saat çalışması yapıyorlar. Joda-Time'ı hiç gereksiz görmüyorum ; yeni bir proje kurarken yaptığım ilk şey Joda-Time'ı eklemek. Sun ve Oracle bile eski java.util.Date & Calendar'ın aşamalı olarak kaldırılması gerektiği konusunda anlaştılar, bu nedenle Java 8'e yeni java.time. * Paketini (Joda-Time'dan esinlenerek) eklediler
Basil Bourque

Android'de Joda ile sorun yaşadım. Tuttu almaClassNotDefinedException
TheRealChx101

23

Java 8'den beri:

LocalDateTime.now().minusHours(1);

LocalDateTimeAPI'ya bakın .


4
Yakın ama tam olarak doğru değil. Bir ZonedDateTimeyerine bir gitmelisin LocalDateTime. "Yerel" aracı değil herhangi bir mekana bağlı ve değil zaman çizelgesine bağladılar. "Noel 25 Aralık 2015 gece yarısında başlar" gibi, zaman diliminde belirli bir anı almak için belirli bir zaman dilimi uygulayana kadar hiçbir anlamı olmayan çeşitli zaman dilimleri arasında farklı bir andır. Ayrıca, saat dilimi olmadan Yaz Saati Uygulaması (DST) ve diğer anormallikler LocalDateTime'ın bu şekilde kullanılmasıyla ele alınmayacaktır. Karşılaştırma ile cevabımı görün .
Basil Bourque

1
Ayrıca java.util.Dateistekte bulunan bir nesneyi almak için bize sordu ZonedDateTime.toInstant()ve Date.from()burada açıklandığı gibi stackoverflow.com/a/32274725/5661065
Hayduke

16

Newish java.util.concurrent.TimeUnit sınıfını kullanarak bunu şöyle yapabilirsiniz

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


7

Bu, Datenesneniz Tarih / Saat biçiminde olduğunda başka bir kod parçasıdır . Bu kodun güzelliği, daha fazla saat verirseniz, tarih de buna göre güncellenir.

    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());

İşte Çıktı:

    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

1
Şunları da kullanabilirsiniz: 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);

4

Kullanmak istiyorsanız java.time, ISO 8601 biçimli süreleri eklemek için bir yöntem aşağıdadır:

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.  

1
Duration.parse(iso8601duration)ilginç, teşekkürler, ancak +üzerinde operatörü kullanamazsınız LocalDateTime, bunu düzenlemek isteyebilirsiniz. Ama .plus(...)işe yarıyor.
qlown

Teşekkürler @ qlown, sanırım + harika çalışıyor çünkü şimdi bunu kullanıyorum. Cevabı buna göre değiştireceğim.
Daniel

Soru, DateUTC'de belirli bir anı temsil eden bir nesne hakkındadır . Kullanımınız LocalDateTimeSoruyu ele almamaktadır. LocalDateTimeherhangi bir saat dilimi veya UTC'den ofset kavramına sahip değildir ve bu nedenle bir anı temsil edemez. Bu sorun için yanlış sınıf. Bkz. Instant ve LocalDateTime arasındaki fark nedir?
Basil Bourque

@BasilBourque Datenesnesi kullanımdan kaldırıldı. Zaman dilimi söz konusu olduğunda soru belirsiz, bu yüzden cevaplarım duruyor. Ayrıca, sadece dışarı takas olabilir LocalDateTimeiçin ZonedDateTime.
Daniel

4

Joda DateTime API ile yapabilirsiniz

DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();

1. satırı DateTime olarak değiştirdikten sonra çalışma dateTime = new DateTime (dateObj);
Sundararaj Govindasamy

1

Java 8 sınıflarını kullanarak. tarih ve saati aşağıdaki gibi kolayca değiştirebiliriz.

LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);

Soru, DateUTC'de belirli bir anı temsil eden bir nesne hakkındadır . Kullanımınız LocalDateTimeSoruyu ele almamaktadır. LocalDateTimeherhangi bir saat dilimi veya UTC'den ofset kavramına sahip değildir ve bu nedenle bir anı temsil edemez. Bu sorun için yanlış sınıf. Bkz. Instant ve LocalDateTime arasındaki fark nedir?
Basil Bourque

0

Java 8'den LocalDateTime sınıfını kullanabilirsiniz. Örneğin:

long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));

Soru, DateUTC'de belirli bir anı temsil eden bir nesne hakkındadır . Kullanımınız LocalDateTimeSoruyu ele almamaktadır. LocalDateTimeherhangi bir saat dilimi veya UTC'den ofset kavramına sahip değildir ve bu nedenle bir anı temsil edemez. Bu sorun için yanlış sınıf. Bkz. Instant ve LocalDateTime arasındaki fark nedir?
Basil Bourque

-1

Bu yöntemi kullanabilirsiniz, Anlamak ve uygulamak kolaydır:

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();
}

Bu yaklaşım, yıllar önce yayınlanan başka bir Cevapta zaten sunulmuştur . Bu nasıl artık değer kattığını görmüyorum.
Basil Bourque

Teklifimin katma değeri basitlik ve uygulama kolaylığıdır, kullanıcı sadece yapıştırmalı ve kullanmalı ve bildiğiniz gibi saat, dakika veya saniye eklemelidir, Başlangıç ​​seviyesi seviyesi farklıdır ve önerilen cevaplar basit cevaplar arasında birleşiyorsa ve gelişmiş cevapları takdir edilecektir :)
Nimpo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.