Zmiana daty Java o godzinę wstecz

124

Mam obiekt daty Java:

Date currentDate = new Date();

To poda aktualną datę i godzinę. Przykład:

Thu Jan 12 10:17:47 GMT 2012

Zamiast tego chcę uzyskać datę, zmieniając ją na godzinę wstecz, więc powinna dać mi:

Thu Jan 12 09:17:47 GMT 2012

Jaki byłby najlepszy sposób na zrobienie tego?

Makky
źródło
czy jest jakiś mktimeodpowiednik w javie? odjąć od tego 60 minut?
Shiplu Mokaddim

Odpowiedzi:

243

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));
Kimi
źródło
8
Tylko pamiętaj
Wolf
Czy pierwsze rozwiązanie z Kalendarzem zadziała, jeśli jest godzina północy jednego dnia i chcesz godzinę wcześniej, czyli o 23:00 poprzedniego dnia?
George Arokiam,
1
@GeorgeArokiam yes it would
Kimi
66

Podobne do rozwiązania @Sumit Jain

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

lub

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));
Peter Lawrey
źródło
3
O wiele lepsze rozwiązanie. Tworzenie instancji kalendarza wygląda na przesadę w tej konkretnej aplikacji.
www.Decompiler.com
2
@cosmolev Kalendarz jest przesadą w większości znalezionych przykładów.
Peter Lawrey
2
@Stoan Dodałem bardziej czytelny przykład. Należy pamiętać, że Kalendarz jest niesamowicie nieefektywny.
Peter Lawrey
@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); To powinno być 10 minut za?
Siya Sosibo
15

tl; dr

W UTC :

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

Lub strefowe:

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

Korzystanie z java.time

Java 8 i nowsze mają wbudowaną nową strukturę java.time .

Instant

Jeśli zależy Ci tylko na czasie UTC (GMT), użyj Instantklasy.

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

Zrzuć na konsolę.

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

natychmiastowy: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z

Zwróć uwagę, jak w tej chwili zdarzyło się przeskoczyć z powrotem do wczorajszej daty.

ZonedDateTime

Jeśli zależy Ci na strefie czasowej, użyj ZonedDateTimeklasy. Możesz zacząć od natychmiastowego i przypisać strefę czasową, ZoneIdobiekt. Ta klasa obsługuje niezbędne korekty anomalii, takich jak czas letni (DST) .

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

Zrzuć na konsolę.

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

natychmiastowy: 2015-10-29T00: 50: 30.778Z

zdt: 2015-10-28T20: 50: 30.778-04: 00 [Ameryka / Montreal]

zdtHourWcześniej: 28-10-2015T19: 50: 30.778-04: 00 [Ameryka / Montreal]

Konwersja

Stare klasy java.util.Date/.Calendar są teraz przestarzałe. Unikaj ich. Są notorycznie kłopotliwe i zagmatwane.

Jeśli musisz użyć starych klas do pracy ze starym kodem, który nie został jeszcze zaktualizowany dla typów java.time, wywołaj metody konwersji. Oto przykładowy kod przechodzący z funkcji Instant lub ZonedDateTime do java.util.Date.

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

…lub…

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

Informacje o java.time

Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date, Calendar, i SimpleDateFormat.

Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani java.sql.*klas.

Skąd wziąć klasy java.time?

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .

Basil Bourque
źródło
Witam panie, nadal nie mogę znaleźć właściwego sposobu na zrobienie „czasu temu” dla Instant.
Ticherhaz
9

Użyj kalendarza .

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);
adarshr
źródło
7

Lub korzystając ze słynnej biblioteki Joda Time :

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();
Jean Logeart
źródło
5

Po prostu odejmij liczbę milisekund w godzinie od daty.

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

Sumit Jain
źródło
4

Możesz użyć poniższego kodu dla daty i godziny:

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

Wynik :

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

Ten link jest dobry: Zobacz tutaj

I zobacz: Zobacz też

I: Tutaj

I: Tutaj

I: Tutaj

Jeśli potrzebujesz tylko czasu:

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

źródło
2
FYI: Ta odpowiedź wykorzystuje kłopotliwe stare klasy Date-Time, które są teraz starsze, wyparte przez nowoczesne klasy java.time.
Basil Bourque
0

Można to osiągnąć za pomocą java.util.Date. Poniższy kod odejmie 1 godzinę od daty.

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

Podobnie jest w przypadku odejmowania 20 sekund od daty

newDate = DateUtils.addSeconds(date, -20)    
Dhananjay
źródło
-1

Uzyskaj czas w milisekundach, minus minuty w milisekundach i przekonwertuj go na datę. Tutaj musisz zobiektywizować !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);
Zenit
źródło
@Makky: Wiem, że wiele się zmieniło. Ale to nie jest zła odpowiedź !!! Dlaczego podajesz złą odpowiedź? Czy w pełni widziałeś zaakceptowaną odpowiedź?
Zenith
1
Dlaczego miałbyś w ogóle odpowiadać na pytanie, które ma 5 lat i zaakceptowało odpowiedź.
Makky
Ta odpowiedź nie zapewnia żadnej wartości poza istniejącymi odpowiedziami sprzed lat. A ta odpowiedź nierozsądnie używa strasznych starych klas daty i czasu, które przez lata były wypierane przez klasy java.time. Inny problem: ta odpowiedź ignoruje kwestię strefy czasowej i pokazuje kod, który będzie korzystał z bieżącej domyślnej strefy czasowej maszyny JVM, podczas gdy pytanie zadawane dla GMT / UTC. Zobacz dalsze części poprawnej odpowiedzi autorstwa Kimiego lub zobacz moją odpowiedź, aby uzyskać więcej dyskusji.
Basil Bourque
-1

U mnie zadziałało zamiast tego przy użyciu formatu. Aby pracować z czasem, po prostu użyj metod parse i toString ()

String localTime = "6:11"; LocalTime localTime = LocalTime.parse (czas lokalny)

LocalTime lt = 6:11; localTime = lt.toString ()

Shahid Hussain Abbasi
źródło
1
Ta odpowiedź nie odnosi się do pytania. Pytanie dotyczy czegoś więcej niż samej pory dnia.
Basil Bourque