Ese es el camino difícil, y esos java.util.Date
métodos de establecimiento han quedado en desuso desde Java 1.1 (1997). Simplemente formatee la fecha usando SimpleDateFormat
un patrón de formato que coincida con la cadena de entrada .
En su caso específico de "2 de enero de 2010" como la cadena de entrada:
- "Enero" es el mes de texto completo, así que usa el
MMMM
patrón
- "2" es el día corto del mes, así que usa el
d
patrón para ello.
- "2010" es el año de 4 dígitos, así que use el
yyyy
patrón para ello.
String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010
Tenga en cuenta la importancia del Locale
argumento explícito . Si lo omite, usará la configuración regional predeterminada que no es necesariamente inglesa como se usa en el nombre del mes de la cadena de entrada. Si la configuración regional no coincide con la cadena de entrada, entonces obtendría una confusa java.text.ParseException
aunque el patrón de formato parezca válido.
Aquí hay un extracto de relevancia del javadoc , que enumera todos los patrones de formato disponibles:
Letter Date or Time Component Presentation Examples
------ ---------------------- ------------------ -------------------------------------
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M/L Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
u Day number of week Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00
Tenga en cuenta que los patrones distinguen entre mayúsculas y minúsculas y que los patrones basados en texto de cuatro caracteres o más representan la forma completa; de lo contrario, se usa una forma corta o abreviada si está disponible. Entonces, por ejemplo, MMMMM
o más es innecesario.
Aquí hay algunos ejemplos de SimpleDateFormat
patrones válidos para analizar una cadena dada hasta la fecha:
Input string Pattern
------------------------------------ ----------------------------
2001.07.04 AD at 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01 EEE, MMM d, ''yy
12:08 PM h:mm a
12 o'clock PM, Pacific Daylight Time hh 'o''clock' a, zzzz
0:08 PM, PDT K:mm a, z
02001.July.04 AD 12:08 PM yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700 EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700 yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700 yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00 yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3 YYYY-'W'ww-u
Una nota importante es que noSimpleDateFormat
es seguro para subprocesos. En otras palabras, nunca debe declararlo y asignarlo como una variable estática o de instancia y luego reutilizarlo desde diferentes métodos / hilos. Siempre debe crearlo completamente nuevo dentro del alcance local del método.
Actualización de Java 8
Si está en Java 8 o más reciente, use DateTimeFormatter
(también aquí, haga clic en el enlace para ver todos los formateadores predefinidos y los patrones de formato disponibles; el tutorial está disponible aquí ). Esta nueva API está inspirada en JodaTime .
String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02
Nota: si su patrón de formato también contiene la parte de tiempo, use en LocalDateTime#parse(text, formatter)
lugar de LocalDate#parse(text, formatter)
. Y, si su patrón de formato también contiene la zona horaria, use ZonedDateTime#parse(text, formatter)
en su lugar.
Aquí hay un extracto de relevancia del javadoc , que enumera todos los patrones de formato disponibles:
Symbol Meaning Presentation Examples
------ -------------------------- ------------ ----------------------------------------------
G era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04
D day-of-year number 189
M/L month-of-year number/text 7; 07; Jul; July; J
d day-of-month number 10
Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter
Y week-based-year year 1996; 96
w week-of-week-based-year number 27
W week-of-month number 4
E day-of-week text Tue; Tuesday; T
e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T
F week-of-month number 3
a am-pm-of-day text PM
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-am-pm (1-24) number 0
H hour-of-day (0-23) number 0
m minute-of-hour number 30
s second-of-minute number 55
S fraction-of-second fraction 978
A milli-of-day number 1234
n nano-of-second number 987654321
N nano-of-day number 1234000000
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
Tenga en cuenta que tiene varios formateadores predefinidos para los patrones más populares. Entonces, en lugar de DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, por ejemplo , podría usar DateTimeFormatter.RFC_1123_DATE_TIME
. Esto es posible porque, por el contrario SimpleDateFormat
, son seguros para subprocesos. Por lo tanto, también podría definir el suyo propio, si es necesario.
Para un formato de cadena de entrada en particular, no necesita usar un explícito DateTimeFormatter
: una fecha estándar ISO 8601 , como 2016-09-26T17: 44: 57Z, puede analizarse directamente LocalDateTime#parse(text)
ya que ya usa el ISO_LOCAL_DATE_TIME
formateador. Del mismo modo, LocalDate#parse(text)
analiza una fecha ISO sin el componente de tiempo (ver ISO_LOCAL_DATE
), yZonedDateTime#parse(text)
analiza una fecha ISO con un desplazamiento y una zona horaria añadidos (ver ISO_ZONED_DATE_TIME
).