Sprawdź klasę kalendarza. Ma addmetodę (i kilka innych) pozwalającą na manipulację czasem. Coś takiego powinno działać.
Calendar cal =Calendar.getInstance();// creates calendar
cal.setTime(newDate());// 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
Po prostu bądź ostrożny, jeśli masz do czynienia z czasem letnim / letnim.
CurtainDog,
5
Nie trzeba wspominać, że możesz dodać „ujemne godziny”
pramodc84
6
@CurtainDog Using Calendar.add()zajmuje się tym automatycznie.
Jesper
6
cal.setTime (new Date ()) nie jest potrzebne - javadoc funkcji Calendar.getInstance () mówi: „Zwrócony kalendarz jest oparty na bieżącym czasie w domyślnej strefie czasowej z domyślnymi ustawieniami regionalnymi”.
Możesz również użyć negatywnych godzin:DateUtils.addHours(oldDate, -1);
Kaptain
Za kulisami robi to dokładnie to samo, co odpowiedź Nikity, ale jest bardzo proste i łatwe do odczytania. Ponadto, jeśli już używasz Apache Commons / Lang ... dlaczego nie?
Matt,
28
Aby uprościć przykład @ Christophera.
Powiedz, że masz stałą
publicstaticfinallong HOUR =3600*1000;// in milli-seconds.
Możesz pisać.
Date newDate =newDate(oldDate.getTime()+2* HOUR);
Jeśli używasz long do przechowywania daty / czasu zamiast obiektu Date, możesz to zrobić
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.
Korzystanie z java.time
Struktura java.time wbudowana w Javę 8 i późniejsze zastępuje stare klasy Java.util.Date/.Calendar. Te stare klasy są bardzo kłopotliwe. Unikaj ich.
Użyj toInstantmetody nowo dodanej do java.util.Date, aby przekonwertować stary typ na nowy typ java.time. Na Instantlinii czasu w UTC znajduje się moment z rozdzielczością nanosekund .
Aby odczytać tę datę i godzinę, wygeneruj ciąg w standardowym formacie ISO 8601, wywołując toString.
String output = instantHourLater.toString();
Możesz chcieć zobaczyć ten moment przez pryzmat zegara ściennego w jakimś regionie . Ustaw Instantżądaną / oczekiwaną strefę czasową, tworząc plik ZonedDateTime.
Możesz też zadzwonić, plusHoursaby dodać liczbę godzin. Bycie strefowym oznacza, że czas letni (DST) i inne anomalie będą obsługiwane w Twoim imieniu.
ZonedDateTime later = zdt.plusHours(8);
Należy unikać używania starych klas daty i godziny, w tym java.util.Datei .Calendar. Ale jeśli naprawdę potrzebujesz java.util.Datewspółdziałania z klasami, które nie zostały jeszcze zaktualizowane dla typów java.time, przekonwertuj z ZonedDateTimevia Instant. Nowe metody dodane do starych klas ułatwiają konwersję do / z typów java.time.
java.util.Date date = java.util.Date.from( later.toInstant());
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.
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 .
+1 trochę niepotrzebne, ale jeśli zamierzasz robić więcej manipulacji datami, czas joda to świetna biblioteka
Joeri Hendrickx
3
@JoeriHendrickx Jeśli programator jest dodawanie godzin do daty, to bardzo prawdopodobne, że robią inne prace data-czas. W ogóle nie uważam Joda-Time za niepotrzebną; Pierwszą rzeczą, którą robię podczas tworzenia nowego projektu, jest dodanie Joda-Time. Nawet Sun i Oracle zgodziły się, że stary java.util.Date & Calendar musi zostać wycofany, więc dodali nowy pakiet java.time. * (Zainspirowany Joda-Time) do Java 8.
Basil Bourque
Miałem problem z Jodą na Androidzie. Utrzymane w zdobywaniuClassNotDefinedException
Blisko, ale nie do końca. Powinieneś wybrać ZonedDateTimeraczej niż LocalDateTime. W „lokalny” oznacza nie związane z żadnym konkretnym obszarze, a nie przywiązany do czasu. Podobnie jak „Boże Narodzenie zaczyna się o północy 25 grudnia 2015 r.” To inny moment w różnych strefach czasowych, bez znaczenia, dopóki nie zastosujesz określonej strefy czasowej, aby wyświetlić określony moment na osi czasu. Ponadto bez strefy czasowej czas letni (DST) i inne anomalie nie będą obsługiwane przy takim użyciu funkcji LocalDateTime. Zobacz moją odpowiedź w porównaniu.
Basil Bourque
1
Również po to, aby uzyskać java.util.Dateobiekt, o który prosił nas ZonedDateTime.toInstant()Date.from()
To kolejny fragment kodu, gdy Dateobiekt jest w formacie Datetime. Piękno tego kodu polega na tym, że jeśli podasz więcej godzin, data również zostanie odpowiednio zaktualizowana.
String myString ="09:00 12/12/2014";SimpleDateFormat simpleDateFormat =newSimpleDateFormat("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 =newGregorianCalendar();
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());
Oto wynik:
This is the ActualDate:FriDec1209:00:00 EST 2014This is HoursAddedDate:SatDec1306:00:00 EST 2014
Możesz również użyć: Calendar cal = Calendar.getInstance ();
Stefan Sprenger
4
Date argDate =newDate();//set your date.String argTime ="09:00";//9 AM - 24 hour format :- Set your time.SimpleDateFormat sdf =newSimpleDateFormat("dd-MMM-yyyy");SimpleDateFormat dateFormat =newSimpleDateFormat("dd-MMM-yyyy HH:mm");String dateTime = sdf.format(argDate)+" "+ argTime;Date requiredDate = dateFormat.parse(dateTime);
Duration.parse(iso8601duration)jest interesujący, dzięki, ale nie możesz używać operatora +na LocalDateTime, możesz chcieć to edytować. Ale .plus(...)działa.
qlown
Dzięki @qlown, myślę, że + działa w groovy, ponieważ tak go teraz używam. Odpowiednio zmodyfikuję odpowiedź.
Daniel
Pytanie dotyczy Dateobiektu, który reprezentuje określony moment w UTC. Twoje użycie LocalDateTimenie odpowiada na pytanie. LocalDateTimenie ma pojęcia strefy czasowej ani przesunięcia w stosunku do UTC, a zatem nie może reprezentować momentu. Niewłaściwa klasa dla tego problemu. Zobacz, jaka jest różnica między funkcją Instant a LocalDateTime?
Basil Bourque
DateObiekt @BasilBourque jest przestarzały. Pytanie jest niejednoznaczne, jeśli chodzi o strefę czasową, więc moje odpowiedzi są aktualne. Co więcej, możesz po prostu zamienić się LocalDateTimena ZonedDateTime.
Daniel
4
Możesz to zrobić za pomocą Joda DateTime API
DateTime date=newDateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
Pytanie dotyczy Dateobiektu, który reprezentuje określony moment w UTC. Twoje użycie LocalDateTimenie odpowiada na pytanie. LocalDateTimenie ma pojęcia strefy czasowej ani przesunięcia w stosunku do UTC, a zatem nie może reprezentować momentu. Niewłaściwa klasa dla tego problemu. Zobacz, jaka jest różnica między funkcją Instant a LocalDateTime?
Basil Bourque
0
Możesz użyć klasy LocalDateTime z Java 8. Na przykład:
long n =4;LocalDateTime localDateTime =LocalDateTime.now();System.out.println(localDateTime.plusHours(n));
Pytanie dotyczy Dateobiektu, który reprezentuje określony moment w UTC. Twoje użycie LocalDateTimenie odpowiada na pytanie. LocalDateTimenie ma pojęcia strefy czasowej ani przesunięcia w stosunku do UTC, a zatem nie może reprezentować momentu. Niewłaściwa klasa dla tego problemu. Zobacz, jaka jest różnica między funkcją Instant a LocalDateTime?
Basil Bourque
-1
Możesz użyć tej metody, jest łatwa do zrozumienia i wdrożenia:
To podejście jest już przedstawione w innej odpowiedzi opublikowanej lata temu. Nie widzę już, jak to dodaje wartości.
Basil Bourque
Wartością dodaną mojej propozycji jest prostota i łatwość implementacji, wystarczy ją wkleić i wykorzystać oraz dodać godziny, minuty czy sekundy, jak wiadomo poziom Początkujących jest różny i czy proponowane odpowiedzi łączą się z prostymi odpowiedziami i zaawansowane odpowiedzi będą odczuwalne :)
Odpowiedzi:
Sprawdź klasę kalendarza. Ma
add
metodę (i kilka innych) pozwalającą na manipulację czasem. Coś takiego powinno działać.Sprawdź API, aby uzyskać więcej informacji.
źródło
Calendar.add()
zajmuje się tym automatycznie.java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Java 8 i Java 9. Zobacz samouczek Oracle .Jeśli używasz Apache Commons / Lang , możesz to zrobić w jednym kroku za pomocą
DateUtils.addHours()
:(Oryginalny obiekt pozostaje niezmieniony)
źródło
DateUtils.addHours(oldDate, -1);
Aby uprościć przykład @ Christophera.
Powiedz, że masz stałą
Możesz pisać.
Jeśli używasz long do przechowywania daty / czasu zamiast obiektu Date, możesz to zrobić
źródło
tl; dr
Lub…
Korzystanie z java.time
Struktura java.time wbudowana w Javę 8 i późniejsze zastępuje stare klasy Java.util.Date/.Calendar. Te stare klasy są bardzo kłopotliwe. Unikaj ich.
Użyj
toInstant
metody nowo dodanej do java.util.Date, aby przekonwertować stary typ na nowy typ java.time. NaInstant
linii czasu w UTC znajduje się moment z rozdzielczością nanosekund .Możesz dodać do tego godziny,
Instant
podającTemporalAmount
npDuration
.Aby odczytać tę datę i godzinę, wygeneruj ciąg w standardowym formacie ISO 8601, wywołując
toString
.Możesz chcieć zobaczyć ten moment przez pryzmat zegara ściennego w jakimś regionie . Ustaw
Instant
żądaną / oczekiwaną strefę czasową, tworząc plikZonedDateTime
.Możesz też zadzwonić,
plusHours
aby dodać liczbę godzin. Bycie strefowym oznacza, że czas letni (DST) i inne anomalie będą obsługiwane w Twoim imieniu.Należy unikać używania starych klas daty i godziny, w tym
java.util.Date
i.Calendar
. Ale jeśli naprawdę potrzebujeszjava.util.Date
współdziałania z klasami, które nie zostały jeszcze zaktualizowane dla typów java.time, przekonwertuj zZonedDateTime
viaInstant
. Nowe metody dodane do starych klas ułatwiają konwersję do / z typów java.time.Więcej informacji na temat konwersji można znaleźć w sekcji Moja odpowiedź na pytanie, Konwersja java.util.Date na jaki typ „java.time”? .
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
, iSimpleDateFormat
.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 .źródło
Z Joda-Time
źródło
ClassNotDefinedException
Od wersji Java 8:
Zobacz
LocalDateTime
API .źródło
ZonedDateTime
raczej niżLocalDateTime
. W „lokalny” oznacza nie związane z żadnym konkretnym obszarze, a nie przywiązany do czasu. Podobnie jak „Boże Narodzenie zaczyna się o północy 25 grudnia 2015 r.” To inny moment w różnych strefach czasowych, bez znaczenia, dopóki nie zastosujesz określonej strefy czasowej, aby wyświetlić określony moment na osi czasu. Ponadto bez strefy czasowej czas letni (DST) i inne anomalie nie będą obsługiwane przy takim użyciu funkcji LocalDateTime. Zobacz moją odpowiedź w porównaniu.java.util.Date
obiekt, o który prosił nasZonedDateTime.toInstant()
Date.from()
Używając nowej klasy java.util.concurrent.TimeUnit możesz to zrobić w ten sposób
źródło
Coś jak:
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Java 8 i Java 9. Zobacz samouczek Oracle .To kolejny fragment kodu, gdy
Date
obiekt jest w formacie Datetime. Piękno tego kodu polega na tym, że jeśli podasz więcej godzin, data również zostanie odpowiednio zaktualizowana.Oto wynik:
źródło
źródło
Jeśli chcesz skorzystać
java.time
, oto metoda dodawania czasów trwania w formacie ISO 8601:źródło
Duration.parse(iso8601duration)
jest interesujący, dzięki, ale nie możesz używać operatora+
naLocalDateTime
, możesz chcieć to edytować. Ale.plus(...)
działa.Date
obiektu, który reprezentuje określony moment w UTC. Twoje użycieLocalDateTime
nie odpowiada na pytanie.LocalDateTime
nie ma pojęcia strefy czasowej ani przesunięcia w stosunku do UTC, a zatem nie może reprezentować momentu. Niewłaściwa klasa dla tego problemu. Zobacz, jaka jest różnica między funkcją Instant a LocalDateTime?Date
Obiekt @BasilBourque jest przestarzały. Pytanie jest niejednoznaczne, jeśli chodzi o strefę czasową, więc moje odpowiedzi są aktualne. Co więcej, możesz po prostu zamienić sięLocalDateTime
naZonedDateTime
.Możesz to zrobić za pomocą Joda DateTime API
źródło
przy użyciu klas Java 8. możemy bardzo łatwo manipulować datą i godziną, jak poniżej.
źródło
Date
obiektu, który reprezentuje określony moment w UTC. Twoje użycieLocalDateTime
nie odpowiada na pytanie.LocalDateTime
nie ma pojęcia strefy czasowej ani przesunięcia w stosunku do UTC, a zatem nie może reprezentować momentu. Niewłaściwa klasa dla tego problemu. Zobacz, jaka jest różnica między funkcją Instant a LocalDateTime?Możesz użyć klasy LocalDateTime z Java 8. Na przykład:
źródło
Date
obiektu, który reprezentuje określony moment w UTC. Twoje użycieLocalDateTime
nie odpowiada na pytanie.LocalDateTime
nie ma pojęcia strefy czasowej ani przesunięcia w stosunku do UTC, a zatem nie może reprezentować momentu. Niewłaściwa klasa dla tego problemu. Zobacz, jaka jest różnica między funkcją Instant a LocalDateTime?Możesz użyć tej metody, jest łatwa do zrozumienia i wdrożenia:
źródło