Java dizesinden tarihe dönüştürme
Java'da 'January 2, 2010' biçimindeki bir String
i bir Date
e dönüştürmenin en iyi yolu nedir?
Nihayetinde, ay, gün ve yılı tamsayı olarak ayırmak istiyorum, böylece
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
tarihi saate dönüştürmek için.
844
3
Bu zor bir yoldur ve bu
java.util.Date
ayarlayıcı yöntemleri Java 1.1'den (1997) beri kullanımdan kaldırılmıştır. Basitçe, giriş dizesiyle eşleşen bir biçim deseni kullanarakSimpleDateFormat
kullanarak tarihi biçimlendirin.Giriş dizesi olarak "January 2, 2010" özel durumunuzda:
MMMM
kalıbını kullanınd
kalıbını kullanın.yyyy
kalıbını kullanın.Açık
Locale
argümanının önemine dikkat edin. Bunu atlarsanız, girdi dizesinin ay adında kullanıldığı gibi İngilizce olması gerekmeyen varsayılan yerel ayarı kullanacaktır. Yerel ayar giriş dizesiyle eşleşmezse, biçim deseni geçerli görünse bile kafa karıştırıcı bir şekilde birjava.text.ParseException
alırsınız.Burada'javadoc]1'dan ilgili bir alıntı, mevcut tüm biçim kalıplarını listeliyor:
Kalıpların büyük/küçük harfe duyarlı olduğunu ve dört veya daha fazla karakterden oluşan metin tabanlı kalıpların tam formu temsil ettiğini unutmayın; aksi takdirde, varsa kısa veya kısaltılmış bir form kullanılır. Yani örneğin
MMMMM
veya daha fazlası gereksizdir.Burada, verilen bir dizeyi tarihe ayrıştırmak için geçerli
SimpleDateFormat
kalıplarının bazı örnekleri verilmiştir:Önemli bir not,
SimpleDateFormat
ın **iş parçacığı güvenli olmadığıdır. Başka bir deyişle, onu asla statik veya örnek değişken olarak bildirmemeli ve atamamalı ve daha sonra farklı yöntemlerden / iş parçacıklarından yeniden kullanmamalısınız. Her zaman yöntemin yerel kapsamında yepyeni oluşturmalısınız.Java 8 güncellemesi
Java 8 veya daha yeni bir sürüm kullanıyorsanız,
DateTimeFormatter
kullanın (ayrıca burada, önceden tanımlanmış tüm biçimlendiricileri ve mevcut biçim kalıplarını görmek için bağlantıya tıklayın; öğretici burada mevcuttur). Bu yeni API JodaTime'den esinlenmiştir.Not: Biçim deseniniz saat kısmını da içeriyorsa
LocalDateTime#parse(text, formatter)
yerineLocalDate#parse(text, formatter)
kullanın. Ve biçim deseniniz saat dilimini de içeriyorsa, bunun yerineZonedDateTime#parse(text, formatter)
kullanın.Burada'javadoc]3'tan ilgili bir alıntı, mevcut tüm biçim kalıplarını listeliyor:
Daha popüler kalıplar için birkaç önceden tanımlanmış biçimlendiriciye sahip olduğunu unutmayın. Örneğin
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
yerineDateTimeFormatter.RFC_1123_DATE_TIME
kullanabilirsiniz. Bu mümkündür, çünküSimpleDateFormat
ın aksine, iş parçacığı güvenlidirler. Bu nedenle, gerekirse kendiniz de tanımlayabilirsiniz.Belirli bir girdi dizesi biçimi için, açık bir
DateTimeFormatter
kullanmanıza gerek yoktur: 2016-09-26T17:44:57Z gibi standart bir ISO 8601 tarihi, zatenISO_LOCAL_DATE_TIME
biçimlendiricisini kullandığından, doğrudanLocalDateTime#parse(text)
ile ayrıştırılabilir. Benzer şekilde,LocalDate#parse(text)
bir ISO tarihini zaman bileşeni olmadan ayrıştırır (bkz.ISO_LOCAL_DATE
) veZonedDateTime#parse(text)
bir ISO tarihini bir ofset ve saat dilimi ekleyerek ayrıştırır (bkz.ISO_ZONED_DATE_TIME
).Ah evet, yine Java Tarihi tartışması. Tarih manipülasyonu ile başa çıkmak için Date, Calendar, GregorianCalendar ve SimpleDateFormat kullanırız. Örneğin Ocak tarihinizi girdi olarak kullanmak gibi:
Sonra bunu aşağıdaki gibi bir şeyle manipüle edebilirsiniz:
SimpleDateFormat sınıfı ile uğraşırken, Date'in iş parçacığı güvenli olmadığını ve tek bir Date nesnesini birden fazla iş parçacığı ile paylaşamayacağınızı hatırlamak önemlidir.
Ayrıca "m" ile "M" arasında büyük fark vardır; burada dakikalar için küçük harf, aylar için büyük harf kullanılır. Aynı şey "d" ve "D" için de geçerlidir. Bu, genellikle gözden kaçan ince hatalara neden olabilir. Daha fazla ayrıntı için Javadoc veya Java'da Dizeyi Tarihe Dönüştürme Kılavuzu bölümlerine bakın.