Vairāk
Java virknes uz datums konversija
Kāds ir labākais veids, kā pārvērst String
formātā '2. janvāris 2010' uz Date
Java?
Galu galā es gribu sadalīt mēnesi, dienu un gadu kā veselos skaitļus, lai es varētu izmantot
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
pārvērst datumu laikā.
844
3
Tas ir sarežģītais veids, un šīs
java.util.Date
iestatīšanas metodes ir atceltas kopš Java 1.1 (1997). Vienkārši formatējiet datumu, izmantojotSimpleDateFormat
, izmantojot formāta paraugu, kas atbilst ievades virknei.Jūsu konkrētajā gadījumā "2010. gada 2. janvāris" kā ievades virkne:
MMMM
šablonu.d
rakstu.yyyy
modeli.Ievērojiet, cik svarīgs ir skaidri norādītais
Locale
arguments. Ja to izlaidīsiet, tiks izmantota noklusējuma vietne, kas ne vienmēr ir angļu valoda, kas izmantota ievades virknes mēneša nosaukumā. Ja locale nesakrīt ar ievades virkni, tad jūs mulsinoši saņemsietjava.text.ParseException
, pat ja formāta modelis šķiet derīgs.Lūk, izraksts no javadoc, kurā uzskaitīti visi pieejamie formāta paraugi:
Ņemiet vērā, ka šabloni ir atkarīgi no mazajiem un lielajiem burtiem un ka četru vai vairāk rakstzīmju teksta šabloni ir pilnā formā; citādi tiek izmantota īsā vai saīsinātā forma, ja tāda ir pieejama. Tāpēc, piemēram,
MMMMM
vai vairāk nav nepieciešams.Šeit ir daži derīgu
SimpleDateFormat
paraugu piemēri, lai analizētu doto virkni līdz datumam:Svarīgi atzīmēt, ka
SimpleDateFormat
nav neierobežo pavedienu drošību. Citiem vārdiem sakot, nekad nevajadzētu deklarēt un piešķirt to kā statisku vai gadījuma mainīgo un pēc tam atkārtoti izmantot to dažādās metodēs/ritmos. Tas vienmēr jāveido pilnīgi jauns metodes lokālajā darbības jomā.Java 8 atjauninājums
Ja izmantojat Java 8 vai jaunāku versiju, izmantojiet
DateTimeFormatter
(arī šeit, noklikšķiniet uz saites, lai apskatītu visus iepriekš definētos formatētājus un pieejamos formātu paraugus; pamācība ir pieejama šeit). Šī jaunā API ir iedvesmojusies no JodaTime.Piezīme: ja jūsu formāta paraugs satur arī laika daļu, tad izmantojiet
LocalDateTime#parse(text, formatter)
, nevisLocalDate#parse(text, formatter)
. Un, ja jūsu formāta paraugs satur arī laika zonu, tad tā vietā izmantojietZonedDateTime#parse(text, formatter)
.Lūk, izraksts no javadoc, kurā uzskaitīti visi pieejamie formāta paraugi:
Ņemiet vērā, ka tam ir vairāki iepriekš definēti formatētāji populārākiem paraugiem. Tā vietā, piemēram,
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, jūs varētu izmantotDateTimeFormatter.RFC_1123_DATE_TIME
. Tas ir iespējams, jo, atšķirībā noSimpleDateFormat
, tie ir droši pret vītnēm. Tādējādi, ja nepieciešams, jūs varētu definēt arī savu.Konkrētam ievades virknes formātam nav nepieciešams izmantot skaidru
DateTimeFormatter
: standarta ISO 8601 datumu, piemēram, 2016-09-26T17:44:57Z, var analizēt tieši arLocalDateTime#parse(text)
, jo tas jau izmantoISO_LOCAL_DATE_TIME
formatētāju. LīdzīgiLocalDate#parse(text)
analizē ISO datumu bez laika komponenta (sk.ISO_LOCAL_DATE
), unZonedDateTime#parse(text)
analizē ISO datumu ar nobīdi un laika zonu (sk.ISO_ZONED_DATE_TIME
).Ak jā, atkal diskusija par Java datumu. Lai veiktu manipulācijas ar datumu, mēs izmantojam Date, Calendar, GregorianCalendar un SimpleDateFormat. Piemēram, kā ievadi izmantojiet savu janvāra datumu:
Pēc tam ar to var manipulēt, izmantojot, piemēram:
Strādājot ar SimpleDateFormat klasi, ir svarīgi atcerēties, ka Date nav thread-safe un vienu Date objektu nevar koplietot ar vairākiem pavedieniem.
Turklāt ir liela atšķirība starp "m" un "M", kur mazo burtu lieto minūtēm, bet lielo burtu lieto mēnesim. Tas pats ir ar "d" un "D". Tas var radīt smalkas kļūdas, kuras bieži vien netiek pamanītas. Sīkāku informāciju skatiet Javadoc vai Guide to Convert String to Date in Java.