Jak dodać n godzin do obiektu Date? Znalazłem inny przykład, używając dni w StackOverflow, ale nadal nie rozumiem, jak to zrobić z godzinami.
Jak dodać n godzin do obiektu Date? Znalazłem inny przykład, używając dni w StackOverflow, ale nadal nie rozumiem, jak to zrobić z godzinami.
Odpowiedzi:
Sprawdź klasę kalendarza. Ma add
metodę (i kilka innych) pozwalającą na manipulację czasem. Coś takiego powinno działać.
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
Sprawdź API, aby uzyskać więcej informacji.
Calendar.add()
zajmuje się tym automatycznie.
java.util.Date
, java.util.Calendar
i java.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()
:
Date newDate = DateUtils.addHours(oldDate, 3);
(Oryginalny obiekt pozostaje niezmieniony)
DateUtils.addHours(oldDate, -1);
Aby uprościć przykład @ Christophera.
Powiedz, że masz stałą
public static final long HOUR = 3600*1000; // in milli-seconds.
Możesz pisać.
Date newDate = new Date(oldDate.getTime() + 2 * HOUR);
Jeśli używasz long do przechowywania daty / czasu zamiast obiektu Date, możesz to zrobić
long newDate = oldDate + 2 * HOUR;
myJavaUtilDate.toInstant()
.plusHours( 8 )
Lub…
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.
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. Na Instant
linii czasu w UTC znajduje się moment z rozdzielczością nanosekund .
Instant instant = myUtilDate.toInstant();
Możesz dodać do tego godziny, Instant
podając TemporalAmount
np Duration
.
Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );
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
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
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.
ZonedDateTime later = zdt.plusHours( 8 );
Należy unikać używania starych klas daty i godziny, w tym java.util.Date
i .Calendar
. Ale jeśli naprawdę potrzebujesz java.util.Date
współdziałania z klasami, które nie zostały jeszcze zaktualizowane dla typów java.time, przekonwertuj z ZonedDateTime
via 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() );
Więcej informacji na temat konwersji można znaleźć w sekcji Moja odpowiedź na pytanie, Konwersja java.util.Date na jaki typ „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 .
DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
ClassNotDefinedException
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ł nas ZonedDateTime.toInstant()
Date.from()
Używając nowej klasy java.util.concurrent.TimeUnit możesz to zrobić w ten sposób
Date oldDate = new Date(); // oldDate == current time
Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours
Coś jak:
Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() +
(2L * hoursInMillis)); // Adds 2 hours
java.util.Date
, java.util.Calendar
i java.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.
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());
Oto wynik:
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
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);
Jeśli chcesz skorzystać java.time
, oto metoda dodawania czasów trwania w formacie ISO 8601:
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.
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.
Date
obiektu, który reprezentuje określony moment w UTC. Twoje użycie LocalDateTime
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
na ZonedDateTime
.
Możesz to zrobić za pomocą Joda DateTime API
DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
przy użyciu klas Java 8. możemy bardzo łatwo manipulować datą i godziną, jak poniżej.
LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);
Date
obiektu, który reprezentuje określony moment w UTC. Twoje użycie LocalDateTime
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:
long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
Date
obiektu, który reprezentuje określony moment w UTC. Twoje użycie LocalDateTime
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:
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();
}