Mam ten obiekt daty:
SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");
Date d1 = df.parse(interviewList.get(37).getTime());
wartość d1 wynosi Fri Jan 07 17:40:00 PKT 2011
Teraz staram się dodać 10 minut do powyższej daty.
Calendar cal = Calendar.getInstance();
cal.setTime(d1);
cal.add(Calendar.MINUTE, 10);
String newTime = df.format(cal.getTime());
Wartość newTime
zmian, 2011-50-07 17:50
ale powinna być 07-01-2011 17:50
.
Dodaje minuty poprawnie, ale zmienia też miesiąc, nie wiem dlaczego!
java
date
calendar
simpledateformat
java.util.date
junaidp
źródło
źródło
Odpowiedzi:
Problem polega na tym, że używasz
mm
. Powinieneś użyćMM
.MM
dotyczy miesiąca imm
minut. Spróbuj zyyyy-MM-dd HH:mm
Inne podejście:
To może być tak proste, jak to (inną opcją jest użycie czasu joda )
źródło
możesz użyć klasy DateUtils w pakiecie org.apache.commons.lang3.time
źródło
org.apache.commons.lang.time.DateUtils
Wygodna metoda implementacji odpowiedzi @ Pangea:
źródło
Aby uniknąć zależności, możesz użyć java.util.Calendar w następujący sposób:
W Javie 8 mamy nowe API:
źródło
To jest niepoprawnie określone:
Używasz minut zamiast miesiąca (MM)
źródło
tl; dr
java.time
Użyj doskonałych klas java.time do pracy z datą i godziną. Te klasy zastępują kłopotliwe stare klasy daty i godziny, takie jak
java.util.Date
ijava.util.Calendar
.ISO 8601
Klasy java.time używają domyślnie standardowych formatów ISO 8601 do analizowania / generowania ciągów wartości daty i godziny. Aby Twój ciąg wejściowy był zgodny, zamień SPACJĘ w środku na
T
.LocalDateTime
Przeanalizuj ciąg wejściowy jako ciąg, ponieważ
LocalDateTime
nie ma żadnych informacji o strefie czasowej lub przesunięciu od czasu UTC.Dodaj dziesięć minut.
Zobacz kod na żywo w IdeOne.com .
To
LocalDateTime
nie ma strefy czasowej, więc nie reprezentuje punktu na osi czasu. Zastosuj strefę czasową, aby przetłumaczyć na aktualny moment. Określ prawidłową nazwę strefy czasowej w formaciecontinent/region
, takie jakAmerica/Montreal
,Africa/Casablanca
alboPacific/Auckland
, alboAsia/Karachi
. Nigdy nie używaj 3-4-literowego skrótu, takiego jakEST
lubIST
lub,PKT
ponieważ nie są to prawdziwe strefy czasowe, nie znormalizowane, a nawet nie unikalne (!).ZonedDateTime
Jeśli znasz docelową strefę czasową dla tej wartości, zastosuj a,
ZoneId
aby uzyskaćZonedDateTime
.Anomalie
Zastanów się, czy dodać te dziesięć minut przed czy po dodaniu strefy czasowej. Możesz otrzymać zupełnie inny wynik z powodu anomalii, takich jak czas letni (DST), który przesuwa czas zegara ściennego .
To, czy należy dodać 10 minut przed, czy po dodaniu strefy, zależy od znaczenia scenariusza biznesowego i reguł.
Porada: Jeśli zamierzasz określić konkretny moment na osi czasu, zawsze przechowuj informacje o strefie czasowej . Nie trać tych informacji, tak jak to się dzieje z danymi wejściowymi. Czy wartość
12:34
ma być południem w Pakistanie, południem we Francji lub południem w Quebecu? Jeśli masz na myśli południe w Pakistanie, powiedz to, dodając przynajmniej przesunięcie-od-UTC (+05:00
), a jeszcze lepiej, nazwę strefy czasowej (Asia/Karachi
).Instant
Jeśli chcesz mieć ten sam moment, który widzisz przez soczewkę UTC , wyodrębnij plik
Instant
.Instant
Klasa reprezentuje moment na osi czasu w UTC z rozdzielczością nanosekund (do dziewięciu (9) cyfr ułamka dziesiętnego).Konwertować
O ile to możliwe, unikaj kłopotliwych starych klas daty i godziny. Ale jeśli musisz, możesz się nawrócić. Wywołaj nowe metody dodane do starych klas.
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 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 .
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
We wzorcu Twojego SimpleDateFormat występuje błąd. powinno być
źródło
użyj tego formatu,
mm dla minut i MM dla mies
źródło
Po przeanalizowaniu daty używam tej funkcji narzędzia, aby dodać godziny, minuty lub sekundy:
Zachowaj ostrożność przy dodawaniu długich okresów, 1 dzień nie zawsze jest 24 godziną (korekty typu czasu letniego, sekundy przestępne itp.), W
Calendar
tym celu zaleca się.źródło
Pracuj dla mnie DateUtils
...
źródło
Można to zrobić bez stałych (np. 3600000 ms to 1h)
przykład użycia:
źródło
Tylko dla każdego, kto jest zainteresowany. Pracowałem nad projektem iOS, który wymagał podobnej funkcjonalności, więc zakończyłem przenoszenie odpowiedzi z @jeznag na swift
źródło