Java Tarihini bir saat geri değiştirme


124

Java tarih nesnem var:

Date currentDate = new Date();

Bu, geçerli tarih ve saati verecektir. Misal:

Thu Jan 12 10:17:47 GMT 2012

Bunun yerine, tarihi bir saat öncesine değiştirerek almak istiyorum, böylece bana şunu vermelidir:

Thu Jan 12 09:17:47 GMT 2012

Bunu yapmanın en iyi yolu ne olabilir?


java'da herhangi bir mktimeeşdeğeri var mı? ondan 60 dakika çıkarılsın mı?
Shiplu Mokaddim

Yanıtlar:


244

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

8
12 saatlik zaman ve Calendar.HOUR_OF_DAY ile 24 saatlik zaman için çalışan Calendar.HOUR olduğu gerçeğinden farklı olun: chintat.blogspot.ca/2006/05/…
Wolf

Saat bir günün gece yarısı ise ve bir önceki gün 23:00 olan bir saat erken olmasını istiyorsanız, Takvim ile ilk çözüm işe yarar mı?
George Arokiam

1
@GeorgeArokiam evet olur
Kimi

66

@Sumit Jain'in çözümüne benzer

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

veya

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));

3
Daha iyi bir çözüm. Takvim örneği oluşturma, bu özel uygulamada aşırıya kaçmış gibi görünüyor.
www.Decompiler.com

2
@cosmolev Calendar, bulduğum çoğu örnekte aşırıdır.
Peter Lawrey

2
@Stoan Daha okunaklı bir örnek ekledim. Takvim'in inanılmaz derecede verimsiz olduğunu unutmamalısınız.
Peter Lawrey

@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); Bu 10 dakika geride mi olmalı?
Siya Sosibo

15

tl; Dr.

In UTC :

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

Veya bölgeli:

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

Java.time kullanma

Java 8 ve sonraki sürümleri, yerleşik olarak yeni java.time çerçevesine sahiptir .

Instant

Yalnızca UTC'yi (GMT) önemsiyorsanız, Instantsınıfı kullanın .

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

Konsola boşaltın.

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

anlık: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z

Bu anda dünün tarihine nasıl geri döndüğünüze dikkat edin.

ZonedDateTime

Bir saat dilimini önemsiyorsanız, ZonedDateTimesınıfı kullanın . Bir Anlık ile başlayabilir ve bir saat dilimi, bir ZoneIdnesne atayabilirsiniz . Bu sınıf, Yaz Saati Uygulaması (DST) gibi anormallikler için gerekli ayarlamaları yapar .

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

Konsola boşaltın.

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

anlık: 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 [America / Montreal]

Dönüştürmek

Eski java.util.Date/.Calendar sınıfları artık modası geçmiş. Onlardan kaçının. Ünlü bir şekilde zahmetli ve kafa karıştırıcıdırlar.

Eski sınıfları, java.time türleri için henüz güncellenmemiş eski kodla çalışmak için kullanmanız gerektiğinde, dönüştürme yöntemlerini çağırın. İşte Instant veya ZonedDateTime'dan java.util.Date'e giden örnek kod.

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

…veya…

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

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 .

Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi önerir .

Daha fazla bilgi edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Java.time nesnelerini doğrudan veritabanınız ile değiş tokuş edebilirsiniz . JDBC 4.2 veya üstü ile uyumlu bir JDBC sürücüsü kullanın . Dizelere gerek yok, derslere gerek yok .java.sql.*

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

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


Merhaba efendim, Instant için "zaman öncesini" yapmanın doğru yolunu hala bulamıyorum.
Ticherhaz

9

Takvim'i kullanın .

Calendar cal = Calendar.getInstance();

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

7

Veya ünlü Joda Time kitaplığını kullanarak :

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();

5

Bir saatteki milisaniye sayısını tarihten çıkarın.

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


4

Tarih ve saat için aşağıdaki koddan kullanabilirsiniz:

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

Çıktı :

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

Bu bağlantı iyidir: Buraya bakın

Ve bakın: Siz de görün

Ve: Burada

Ve: Burada

Ve: Burada

Sadece zamana ihtiyacınız varsa:

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

2
Bilginize: Bu Yanıt, modern java.time sınıflarının yerini alan, artık eski olan zahmetli eski Tarih-saat sınıflarını kullanır.
Basil Bourque

0

Bu kullanılarak elde edilebilir java.util.Date. Aşağıdaki kod, tarihinizden 1 saat çıkaracaktır.

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

Aynı şekilde tarihinizden 20 saniye çıkarmak için

newDate = DateUtils.addSeconds(date, -20)    

-1

Zamanı milisaniye cinsinden alın, dakikalarınızı milisaniye olarak alın ve Tarihe dönüştürün. Burada birini nesneleştirmeniz gerekiyor !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);

@Makky: İşlerin değiştiğini biliyorum. Ama bu yanlış bir cevap değil !!! Neden buna yanlış cevap veriyorsun? Kabul edilen cevabı tam olarak gördünüz mü?
Zenith

1
5 yaşında olan ve cevabını kabul eden bir soruya neden cevap veresiniz?
Makky

Bu Cevap, mevcut yıllık Cevapların ötesinde hiçbir değer sağlamaz. Ve bu Cevap, yıllarca java.time sınıfları tarafından değiştirilen eski korkunç tarih-saat sınıflarını akıllıca kullanır. Başka bir sorun: Bu Yanıt, saat dilimi sorununu yok sayar ve Soru GMT / UTC'yi sorarken JVM'nin geçerli varsayılan saat dilimini kullanacak kodu gösterir. Sonraki kısımlarını görün Kimi tarafından doğru Yanıt veya bkz benim Answer fazla tartışma için.
Basil Bourque

-1

Biçimi kullanmak yerine benim için çalıştı. Zamanla çalışmak için sadece parse ve toString () yöntemlerini kullanın

Dize localTime = "6:11"; LocalTime localTime = LocalTime.parse (localtime)

Yerel Saat lt = 6:11; localTime = lt.toString ()


1
Bu Cevap Soruyu ele almıyor. Soru, yalnızca bir günün zamanından fazlasıyla ilgili.
Basil Bourque
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.