Cambiar el formato de fecha en una cadena Java

465

Tengo Stringuna cita representativa.

String date_s = "2011-01-18 00:00:00.0";

Me gustaría convertirlo en a Datey mostrarlo en YYYY-MM-DDformato.

2011-01-18

¿Cómo puedo conseguir esto?


De acuerdo, según las respuestas que obtuve a continuación, aquí hay algo que he intentado:

String date_s = " 2011-01-18 00:00:00.0"; 
SimpleDateFormat dt = new SimpleDateFormat("yyyyy-mm-dd hh:mm:ss"); 
Date date = dt.parse(date_s); 
SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");
System.out.println(dt1.format(date));

Pero sale en 02011-00-1lugar de lo deseado 2011-01-18. ¿Qué estoy haciendo mal?

amit4444
fuente
163
aaaa no es lo mismo que aaaa. :)
Aerodeslizador lleno de anguilas
2
Una pregunta boomerang. ¿Cuál es su caso de uso? Porque es posible que deba usar patrones integrados (DateFormat.getDateTimeInstance ()).
Paweł Dyda
11
El mes se representa con MM en la cadena de formato, no con mm como en los ejemplos anteriores. mm significa minutos.
Mike
3
Cambié aaaa-mm-dd a aaaa-MM-dd, porque la versión inicial no funcionaba
Pavlo Zvarych

Respuestas:

506

Use LocalDateTime#parse()(o ZonedDateTime#parse()si la cadena contiene una parte de zona horaria) para analizar Stringun cierto patrón en un LocalDateTime.

String oldstring = "2011-01-18 00:00:00.0";
LocalDateTime datetime = LocalDateTime.parse(oldstring, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"));

Use LocalDateTime#format()(o ZonedDateTime#format()) para formatear un LocalDateTimea Stringen un cierto patrón.

String newstring = datetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(newstring); // 2011-01-18

O , cuando aún no está en Java 8, use SimpleDateFormat#parse()para analizar Stringun cierto patrón en un Date.

String oldstring = "2011-01-18 00:00:00.0";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(oldstring);

Use SimpleDateFormat#format()para formatear un Datea Stringen un cierto patrón.

String newstring = new SimpleDateFormat("yyyy-MM-dd").format(date);
System.out.println(newstring); // 2011-01-18

Ver también:


Actualización : según su intento fallido: los patrones distinguen entre mayúsculas y minúsculas . Lea el java.text.SimpleDateFormatjavadoc que significan las partes individuales. Así se destaca, por ejemplo, Mdurante meses y mminutos. Además, existen años de cuatro dígitosyyyy , no cinco yyyyy. Mire más de cerca los fragmentos de código que publiqué aquí arriba.

BalusC
fuente
¿Qué sucede si desea que la fecha se vea como "Lunes 1 de septiembre de 2012"?
crmepham
11
@crm: Simplemente haga clic en el enlace javadoc, calcule los caracteres de patrón necesarios allí y modifique el patrón en consecuencia.
BalusC
Cuando aún no esté en Java 8, considere usar el backport, ThreeTen Backport y luego los primeros ejemplos de la respuesta. O para Android por debajo del nivel 26 de API, ThreeTenABP .
Ole VV
157

El formato es SENSIBLE A LAS CASAS, así que USE MM para el mes, no mm (esto es para los minutos) y aaaa. Para referencia , puede usar la siguiente hoja de referencia.

G   Era designator  Text    AD
y   Year    Year    1996; 96
Y   Week year   Year    2009; 09
M   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 name in week    Text    Tuesday; Tue
u   Day number of week (1 = Monday, ..., 7 = Sunday)    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

Ejemplos:

"yyyy.MM.dd G 'at' HH:mm:ss z"  2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"  Wed, Jul 4, '01
"h:mm a"    12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"  02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"    Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"   2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"   2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u"  2001-W27-3
Dev
fuente
1
"aaaa-MM-dd'T'HH: mm: ss.SSSZ" debería ser "aaaa-MM-dd'T'HH: mm: ss.SSS'Z '"
un jugador justo
2
no, si pones Z entre comillas simples, dará Z como salida, pero sin él dará Timezone. p.ej. 2014-08-14T01: 24: 57.236Z y desde afuera 2014-08-14T01: 24: 57.236-0530 -> Probé en jdk1.7
Dev
1
"aaaaa.MMMMM.dd GGG hh: mm aaa" 02001.Julio.04 AD 12:08 PM Nota M extra en el mes. ¡Cuatro, no cinco!
Stefano Mtangoo
Si son 4 letras o más, se utiliza el formulario completo. así que puedes usar 4 veces m o incluso 5 veces m es lo mismo
Dev
Esto es más o menos un Copy-Paste de los documentos. No se proporcionan explicaciones adicionales, y no hay un enlace a los documentos donde se pueda obtener más información si es necesario. -1. ( Aquí está el enlace por cierto )
XenoRo
108

La respuesta es, por supuesto, crear un objeto SimpleDateFormat y usarlo para analizar cadenas hasta la fecha y formatear fechas en cadenas. Si probó SimpleDateFormat y no funcionó, muestre su código y cualquier error que pueda recibir.

Anexo: "mm" en el formato Cadena no es lo mismo que "MM". Use MM por meses y mm por minutos. Además, aaaa no es lo mismo que aaaa. p.ej,:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FormateDate {

    public static void main(String[] args) throws ParseException {
        String date_s = "2011-01-18 00:00:00.0";

        // *** note that it's "yyyy-MM-dd hh:mm:ss" not "yyyy-mm-dd hh:mm:ss"  
        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = dt.parse(date_s);

        // *** same for the format String below
        SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(dt1.format(date));
    }

}
Aerodeslizador lleno de anguilas
fuente
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class formateDate {/ ** * @param args * @throws ParseException * / public static void main (String [] args) lanza ParseException {// TODO Stub de método generado automáticamente String date_s = "2011-01-18 00:00 : 00.0 "; SimpleDateFormat dt = new SimpleDateFormat ("aaaaa-mm-dd hh: mm: ss"); Fecha fecha = dt.parse (fecha_s); SimpleDateFormat dt1 = new SimpleDateFormat ("aaaaa-mm-dd"); System.out.println (dt1.format (fecha)); }} Quiero poner fuera debería ser "2011-01-18" pero poner fuera es 02011-00-1
amit4444
Publique cualquier código que tenga como agregado a la pregunta original (cuatro espacios sangrados). De esta manera conservará su formato y luego podremos leerlo.
Aerodeslizador lleno de anguilas
1
Ver editar mi respuesta arriba. Estás usando "mm" en tu formato Cadena donde deberías estar usando "MM"
Hovercraft Full Of Eels
hhle dará la hora en el rango 1-12, deberá usar aademás de imprimir / analizar AMo PM. Para imprimir / analizar la hora en el rango 0-23, use HH.
Andre Holzner
22

¿Por qué no simplemente usar esto?

Date convertToDate(String receivedDate) throws ParseException{
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        Date date = formatter.parse(receivedDate);
        return date;
    }

Además, esta es la otra manera:

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
String requiredDate = df.format(new Date()).toString();

o

Date requiredDate = df.format(new Date());

¡Salud!

89n3ur0n
fuente
2
¿Por qué no usar esto? Porque (a) ignora el tema de la zona horaria. La determinación de la fecha depende de la zona horaria. Este código depende de la zona horaria predeterminada de la JVM. Por lo tanto, los resultados pueden variar inadvertidamente. Y (b) porque las clases java.util.Date y SimpleDateFormat son notoriamente problemáticas y deben evitarse.
Basil Bourque
2
siempre devuelve strin, Date requiredDate = df.format (new Date ());
entrega el
15

Usando el java.timepaquete en Java 8 y posterior:

String date = "2011-01-18 00:00:00.0";
TemporalAccessor temporal = DateTimeFormatter
    .ofPattern("yyyy-MM-dd HH:mm:ss.S")
    .parse(date); // use parse(date, LocalDateTime::from) to get LocalDateTime
String output = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(temporal);
Vitalii Fedorenko
fuente
9

[editado para incluir las correcciones de BalusC] La clase SimpleDateFormat debería hacer el truco:

String pattern = "yyyy-MM-dd HH:mm:ss.S";
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
  Date date = format.parse("2011-01-18 00:00:00.0");
  System.out.println(date);
} catch (ParseException e) {
  e.printStackTrace();
}
Bryan
fuente
DDsignifica "día en año", no "día en mes". hhsignifica "hora en am / pm (1-12)", no "hora en día (0-23)".
BalusC
9

Otras respuestas son correctas, básicamente tenía el número incorrecto de caracteres "y" en su patrón.

Zona horaria

Sin embargo, un problema más ... No abordó las zonas horarias. Si pretendías UTC , entonces debería haberlo dicho. Si no, las respuestas no están completas. Si todo lo que desea es la parte de la fecha sin la hora, entonces no hay problema. Pero si realiza más trabajo que puede implicar tiempo, entonces debe especificar una zona horaria.

Joda-Time

Aquí está el mismo tipo de código pero usando la biblioteca Joda-Time 2.3 de código abierto de terceros

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

String date_s = "2011-01-18 00:00:00.0";

org.joda.time.format.DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern( "yyyy-MM-dd' 'HH:mm:ss.SSS" );
// By the way, if your date-time string conformed strictly to ISO 8601 including a 'T' rather than a SPACE ' ', you could
// use a formatter built into Joda-Time rather than specify your own: ISODateTimeFormat.dateHourMinuteSecondFraction().
// Like this:
//org.joda.time.DateTime dateTimeInUTC = org.joda.time.format.ISODateTimeFormat.dateHourMinuteSecondFraction().withZoneUTC().parseDateTime( date_s );

// Assuming the date-time string was meant to be in UTC (no time zone offset).
org.joda.time.DateTime dateTimeInUTC = formatter.withZoneUTC().parseDateTime( date_s );
System.out.println( "dateTimeInUTC: " + dateTimeInUTC );
System.out.println( "dateTimeInUTC (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInUTC ) );
System.out.println( "" ); // blank line.

// Assuming the date-time string was meant to be in Kolkata time zone (formerly known as Calcutta). Offset is +5:30 from UTC (note the half-hour).
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID( "Asia/Kolkata" );
org.joda.time.DateTime dateTimeInKolkata = formatter.withZone( kolkataTimeZone ).parseDateTime( date_s );
System.out.println( "dateTimeInKolkata: " + dateTimeInKolkata );
System.out.println( "dateTimeInKolkata (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInKolkata ) );
// This date-time in Kolkata is a different point in the time line of the Universe than the dateTimeInUTC instance created above. The date is even different.
System.out.println( "dateTimeInKolkata adjusted to UTC: " + dateTimeInKolkata.toDateTime( org.joda.time.DateTimeZone.UTC ) );

Cuando corres ...

dateTimeInUTC: 2011-01-18T00:00:00.000Z
dateTimeInUTC (date only): 2011-01-18

dateTimeInKolkata: 2011-01-18T00:00:00.000+05:30
dateTimeInKolkata (date only): 2011-01-18
dateTimeInKolkata adjusted to UTC: 2011-01-17T18:30:00.000Z
Albahaca Bourque
fuente
9

Consulte "Patrones de fecha y hora" aquí. http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;

public class DateConversionExample{

  public static void main(String arg[]){

    try{

    SimpleDateFormat sourceDateFormat = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");

    Date date = sourceDateFormat.parse("2011-01-18 00:00:00.0");


    SimpleDateFormat targetDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(targetDateFormat.format(date));

    }catch(ParseException e){
        e.printStackTrace();
    }
  } 

}
Piedra de toque
fuente
8
try
 {
    String date_s = "2011-01-18 00:00:00.0";
    SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
    Date tempDate=simpledateformat.parse(date_s);
    SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd");           
    System.out.println("Output date is = "+outputDateFormat.format(tempDate));
  } catch (ParseException ex) 
  {
        System.out.println("Parse Exception");
  }
Fathah Rehman P
fuente
7
public class SystemDateTest {

    String stringDate;

    public static void main(String[] args) {
        SystemDateTest systemDateTest = new SystemDateTest();
        // format date into String
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
        systemDateTest.setStringDate(simpleDateFormat.format(systemDateTest.getDate()));
        System.out.println(systemDateTest.getStringDate());
    }

    public Date getDate() {
        return new Date();
    }

    public String getStringDate() {
        return stringDate;
    }

    public void setStringDate(String stringDate) {
        this.stringDate = stringDate;
    }
}
Neeraj Gahlawat
fuente
3
Agregue información a su (s) respuesta (s) para explicar su código.
Kursad Gulseven
hay un nombre de método getDate () mediante el cual puede obtener obj de fecha después de que aplique SimpleDateFormat para que pueda convertir la fecha de acuerdo con su formato que se define en el constructor SimpleDateFormat y establecer en el método StringDate, puede hacerlo en caché
almacene en
6
   String str = "2000-12-12";
   Date dt = null;
   SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

    try 
    {
         dt = formatter.parse(str);
    }
    catch (Exception e)
    {
    }

    JOptionPane.showMessageDialog(null, formatter.format(dt));
Eren
fuente
6

Solo puedes usar:

Date yourDate = new Date();

SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
String date = DATE_FORMAT.format(yourDate);

Funciona perfectamente!

cнŝdk
fuente
5

También puedes usar substring ()

String date_s = "2011-01-18 00:00:00.0";
date_s.substring(0,10);

Si desea un espacio delante de la fecha, use

String date_s = " 2011-01-18 00:00:00.0";
date_s.substring(1,11);
Martín
fuente
5

Puede probar Java 8 nuevo date, puede encontrar más información en la documentación de Oracle .

O puedes probar el viejo

public static Date getDateFromString(String format, String dateStr) {

    DateFormat formatter = new SimpleDateFormat(format);
    Date date = null;
    try {
        date = (Date) formatter.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return date;
}

public static String getDate(Date date, String dateFormat) {
    DateFormat formatter = new SimpleDateFormat(dateFormat);
    return formatter.format(date);
}
Ran Adler
fuente
4
private SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy");

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    if(value instanceof Date) {
        value = dataFormat.format(value);
    }
    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
};
usuario2632575
fuente
3

eliminar una forma y SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");debe serSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");

Pankaj Sharma
fuente
No exactamente. También necesita el caso correcto (no importa si usa lo moderno DateTimeFormattero se aferra a lo anticuado SimpleDateFormat).
Ole VV
0

SimpleDateFormat dt1 = new SimpleDateFormat ("aaaa-mm-dd");

Soumya Mahapatra
fuente
Esta clase de fecha y hora fue suplantada hace años por las modernas clases java.time . Específicamente DateTimeFormattery DateTimeFormatterBuilder. Sugerir SimpleDateFormaten 2019 es un mal consejo.
Basil Bourque
Incorrecto Sus códigos de formato aquí son incorrectos. hhes por hora.
Basil Bourque
Usualmente esperamos alguna discusión o explicación. Stack Overflow está destinado a ser más que una biblioteca de fragmentos.
Basil Bourque
0

Digamos que desea cambiar 2019-12-20 10:50 AM GMT + 6: 00 a 2019-12-20 10:50 AM primero que nada tiene que entender el formato de fecha primero el formato de fecha es aaaa-MM-dd hh : mm a zzz y el segundo formato de fecha será aaaa-MM-dd hh: mm a

solo devuelve una cadena de esta función como.

public String convertToOnlyDate(String currentDate) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a ");
    Date date;
    String dateString = "";
    try {
        date = dateFormat.parse(currentDate);
        System.out.println(date.toString()); 

        dateString = dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return dateString;
}

Esta función le devolverá su respuesta de deseo. Si desea personalizar más, simplemente agregue o elimine el componente del formato de fecha.

pavel
fuente