tl; dr
LocalDateTime.parse(
"2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )
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
i java.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
.
String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "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.
LocalDateTime ldt = LocalDateTime.parse( inputModified );
Dodaj dziesięć minut.
LocalDateTime ldtLater = ldt.plusMinutes( 10 );
ldt.toString (): 2016-01-23T12: 34
ldtLater.toString (): 2016-01-23T12: 44
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 formacie continent/region
, takie jak America/Montreal
, Africa/Casablanca
albo Pacific/Auckland
, albo Asia/Karachi
. Nigdy nie używaj 3-4-literowego skrótu, takiego jak EST
lub IST
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
.
ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );
zdt.toString (): 2016-01-23T12: 44 + 05: 00 [Azja / Karaczi]
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).
Instant instant = zdt.toInstant();
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.
java.util.Date utilDate = java.util.Date.from( instant );
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 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?
- Java SE 8 i SE 9 i nowsze
- Wbudowany.
- Część standardowego interfejsu API języka Java z dołączoną implementacją.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i SE 7
- Wiele funkcji java.time jest przenoszonych z powrotem do Java 6 i 7 w ThreeTen-Backport .
- Android
- Projekt ThreeTenABP dostosowuje ThreeTen-Backport (wspomniany powyżej) specjalnie dla Androida.
- Zobacz, jak używać… .
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 .