tl; Dr.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00: 00 + 01: 00 [Avrupa / Paris]
İstediğiniz biçimde bir Dize oluşturmak için bir DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
2008-01-01 00:00:00
ayrıntılar
Diğer Cevaplar doğrudur, ancak java.time çerçevesi tarafından artık modası geçmiş eski tarih-saat sınıflarını kullanın.
java.time
Java.time çerçevesi, Java 8 ve sonraki sürümlerde yerleşiktir. Java.time işlevinin çoğu Java 6 & 7'ye ( ThreeTen-Backport ) geri taşınır ve ayrıca Android'e ( ThreeTenABP ) uyarlanır .
Önce giriş dizesini ISO 8601 biçiminin kanonik sürümüyle uyumlu olacak şekilde değiştirin. Standart ISO 8601 biçimleri, java.time sınıflarında varsayılan olarak tarih-saat değerlerini temsil eden dizeleri ayrıştırmak / oluşturmak için kullanılır. Ortadaki SPACE'i a ile değiştirmemiz gerekiyor T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
Şimdi LocalDateTime
, "Yerel" ifadesinin belirli bir yer olmadığı anlamına geldiği bir şekilde ayrıştırabiliriz . Girişte herhangi bir UTC'den uzaklık veya saat dilimi bilgisi yok.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13: 15: 00
Günün saatini veya saat dilimini önemsemiyorsanız, bir LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 2008-01-01
Günün İlk Anı
Bunun yerine günün saatinin günün ilk anına ayarlanmasını istiyorsanız, bir ZonedDateTime
sınıf kullanın , ardından yöntemini LocalDate
çağırmak için bir nesneye dönüştürün atStartOfDay
. 00:00:00
Yaz Saati Uygulaması veya başka anormallikler nedeniyle ilk anın zamanı olmayabileceğini unutmayın .
Saat dilimi çok önemlidir çünkü herhangi bir an için tarih dünyanın her yerinde bölgeye göre değişir. Örneğin, Paris'te gece yarısından birkaç dakika sonra Parisliler için yeni bir gün, ancak Kanadalılar için Montréal'de hala "dün".
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [Amerika / Montreal]
UTC
O anı UTC saat diliminin merceğinden görmek için bir Instant
nesne çıkarın . Hem ve ZonedDateTime
hem Instant
de zaman çizelgesinde aynı anı temsil edecek, ancak iki farklı duvar saati olarak görünecektir .
An Instant
, java.time'daki temel yapı taşı sınıfıdır, tanımı gereği her zaman UTC'dir. Genel olarak iş mantığınızı, veri depolamanızı ve veri alışverişinizi UTC'de yapmanız gerektiği için bu sınıfı sık sık kullanın.
Instant instant = zdtStartOfDay.toInstant();
instant.toString ()… 2008-01-01T05: 00: 00Z
Gece yarısı inme yerine sabah 5'i görüyoruz. Standart formatta, Z
sondaki kısadır Zulu
ve "UTC" anlamına gelir.
Hakkında java.time
Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date
, Calendar
& SimpleDateFormat
.
Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi önerir .
Daha fazla bilgi edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .
Java.time nesnelerini doğrudan veritabanınız ile değiş tokuş edebilirsiniz . JDBC 4.2 veya üstü ile uyumlu bir JDBC sürücüsü kullanın . Dizelere gerek yok, derslere gerek yok .java.sql.*
Java.time sınıflarını nereden edinebilirim?
ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için kanıtlayıcı bir zemindir. Burada bazı yararlı sınıfları gibi bulabilir Interval
, YearWeek
, YearQuarter
, ve daha .