Cambia il formato della data in una stringa Java


465

Ho Stringuna data rappresentativa.

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

Mi piacerebbe convertirlo in a Datee inviarlo in YYYY-MM-DDformato.

2011-01-18

Come posso raggiungere questo obiettivo?


Ok, in base alle risposte che ho recuperato di seguito, ecco qualcosa che ho provato:

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));

Ma emette 02011-00-1invece del desiderato 2011-01-18. Che cosa sto facendo di sbagliato?


163
yyyyy non è lo stesso di yyyy. :)
Hovercraft Full Of Eels

2
Una domanda boomerang. Qual è il tuo caso d'uso? Perché è possibile utilizzare modelli incorporati (DateFormat.getDateTimeInstance ()).
Paweł Dyda,

11
Il mese è rappresentato con MM nella stringa di formato, non con mm come negli esempi sopra. mm significa minuti.
Mike,

3
Ho cambiato aaaa-mm-gg in aaaa-MM-gg, perché la versione iniziale non ha funzionato
Pavlo Zvarych,

Risposte:


506

Utilizzare LocalDateTime#parse()(o ZonedDateTime#parse()se la stringa contiene una parte di fuso orario) per analizzare a Stringin un determinato modello in a LocalDateTime.

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

Utilizzare LocalDateTime#format()(o ZonedDateTime#format()) per formattare una LocalDateTimein una Stringin un determinato modello.

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

Oppure , quando non sei ancora su Java 8, usa SimpleDateFormat#parse()per analizzare a Stringin un certo modello in a Date.

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

Utilizzare SimpleDateFormat#format()per formattare a Datein a Stringin un determinato modello.

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

Guarda anche:


Aggiornamento : secondo il tuo tentativo fallito: gli schemi fanno distinzione tra maiuscole e minuscole . Leggi il java.text.SimpleDateFormatjavadoc che cosa significano le singole parti. Così vale per esempio Mper mesi e mminuti. Inoltre, esistono anni di quattro cifre yyyy, non di cinque yyyyy. Guarda più da vicino gli snippet di codice che ho pubblicato qui sopra.


Che cosa succede se si desidera che la data appaia come "lunedì 1 settembre 2012"?
crmepham,

11
@crm: fai semplicemente clic sul link javadoc, calcola i caratteri del pattern necessari e modifica il pattern di conseguenza.
BalusC,

Quando non sei ancora su Java 8, considera l'utilizzo del backport, ThreeTen Backport e quindi i primi esempi dalla risposta. O per Android al di sotto del livello API 26, ThreeTenABP .
Ole VV,

157

La formattazione è CASE SENSITIVE, quindi USA MM per il mese non mm (questo è per il minuto) e yyyy Per riferimento puoi usare il seguente cheatsheet.

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

Esempi:

"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

1
"yyyy-MM-dd'T'HH: mm: ss.SSSZ" dovrebbe essere "yyyy-MM-dd'T'HH: mm: ss.SSS'Z '"
un giocatore giusto

2
no, se metti Z in virgoletta singola, otterrai Z come output, ma senza di essa darà Timezone. per esempio. 2014-08-14T01: 24: 57.236Z e dall'esterno 14-08-2014T01: 24: 57.236-0530 -> Ho provato su jdk1.7
Dev

1
"yyyyy.MMMMM.dd GGG hh: mm aaa" 02001. luglio.04 AD 12:08 PM Nota M supplementare nel mese. Quattro non cinque!
Stefano Mtangoo,

se è composto da almeno 4 lettere, viene utilizzato il modulo completo. quindi puoi usare 4 volte m o anche 5 volte m lo stesso
Dev

Questo è praticamente un copia-incolla dei documenti. Non vengono fornite ulteriori spiegazioni e non esiste alcun collegamento ai documenti in cui è possibile acquisire ulteriori informazioni, se necessario. -1. ( Ecco il link tra l'altro )
XenoRo

108

La risposta è ovviamente quella di creare un oggetto SimpleDateFormat e usarlo per analizzare le stringhe fino ad oggi e formattare le date in stringhe. Se hai provato SimpleDateFormat e non ha funzionato, mostra il tuo codice e gli eventuali errori che potresti ricevere.

Addendum: "mm" nel formato String non è uguale a "MM". Usa MM per mesi e mm per minuti. Inoltre, yyyyy non è uguale a yyyy. per esempio,:

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));
    }

}

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) genera ParseException {// TODO Metodo generato automaticamente stub String date_s = "2011-01-18 00:00 : 00.0" ; SimpleDateFormat dt = new SimpleDateFormat ("aaaaa-mm-gg hh: mm: ss"); Date date = dt.parse (date_s); SimpleDateFormat dt1 = new SimpleDateFormat ("yyyyy-mm-dd"); System.out.println (dt1.format (data)); }} Voglio che put put sia "2011-01-18" ma out put è 02011-00-1
amit4444

Pubblica qualsiasi codice che hai in aggiunta alla domanda originale (quattro spazi rientrati). In questo modo manterrà la sua formattazione e potremo quindi leggerla.
Hovercraft Full Of Eels

1
Vedi modifica alla mia risposta sopra. Stai usando "mm" nel tuo formato String dove dovresti usare "MM"
Hovercraft Full Of Eels

hhti darà l'ora nell'intervallo 1-12, dovrai usare aoltre a stampare / analizzare AMo PM. Per stampare / analizzare l'ora nell'intervallo 0-23, utilizzare HH.
Andre Holzner,

22

Perché non semplicemente usare questo

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

Inoltre, questo è l'altro modo:

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

o

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

Saluti!


2
Perché non usarlo? Perché (a) ignora il problema del fuso orario. La determinazione della data dipende dal fuso orario. Questo codice dipende dal fuso orario predefinito della JVM. Pertanto, i risultati possono variare inavvertitamente. E (b) perché le classi java.util.Date e SimpleDateFormat sono notoriamente problematiche e dovrebbero essere evitate.
Basil Bourque,

2
restituisce sempre strin, Date requiredDate = df.format (new Date ());
consegna il

15

Utilizzo del java.timepacchetto in Java 8 e versioni successive:

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);

9

[modificato per includere le correzioni di BalusC] La classe SimpleDateFormat dovrebbe fare il trucco:

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();
}

DDsta per "giorno nell'anno", non "giorno nel mese". hhsta per "ora in am / pm (1-12)", non "ora in giorno (0-23)".
BalusC,

9

Altre risposte sono corrette, in pratica hai avuto un numero sbagliato di caratteri "y" nel tuo schema.

Fuso orario

Un altro problema però ... Non hai affrontato i fusi orari. Se intendevi UTC , avresti dovuto dirlo. In caso contrario, le risposte non sono complete. Se tutto ciò che desideri è la parte della data senza l'ora, quindi nessun problema. Ma se fai ulteriori lavori che potrebbero comportare il tempo, dovresti specificare un fuso orario.

Joda-Time

Ecco lo stesso tipo di codice ma si utilizza la libreria Joda-Time 2.3 open source di terze parti

// © 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 ) );

Quando eseguito ...

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

9

Fare riferimento a "Modelli di data e ora" qui. 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();
    }
  } 

}

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");
  }

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;
    }
}

3
Aggiungi alcune informazioni alle tue risposte per spiegare il tuo codice.
Kursad Gulseven,

esiste un nome metodo getDate () con il quale è possibile ottenere la data obj dopo l'applicazione di SimpleDateFormat in modo da poter convertire la data in base al formato definito nel costruttore SimpleDateFormat e impostato nel metodo StringDate per renderlo memorizzato nella cache
Neeraj Gahlawat

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));

6

Puoi semplicemente usare:

Date yourDate = new Date();

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

Funziona perfettamente!


5

Puoi anche usare la sottostringa ()

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

Se vuoi uno spazio davanti alla data, usa

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

5

È possibile provare Java 8 nuovo date, ulteriori informazioni sono disponibili nella documentazione di Oracle .

Oppure puoi provare quello vecchio

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);
}

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);
};

3

rimuovere un modulo y SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");dovrebbe essereSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


Non esattamente. Hai bisogno anche del caso corretto (non importa se usi il moderno DateTimeFormattero ti aggrappi a quello obsoleto SimpleDateFormat).
Ole VV,

0

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


Questa lezione di data e ora è stata soppiantata anni fa dalle moderne classi java.time . In particolare DateTimeFormattere DateTimeFormatterBuilder. Suggerire SimpleDateFormatnel 2019 è un consiglio scadente.
Basil Bourque,

Errato I codici di formattazione qui sono errati. hhè per ora.
Basil Bourque,

Di solito ci aspettiamo qualche discussione o spiegazione. Stack Overflow è pensato per essere più di una semplice libreria di frammenti.
Basil Bourque,

0

Supponiamo che tu voglia cambiare il 20-12-2019 10:50 GMT + 6: 00-20-20-12-2010 10:50 prima di tutto devi capire il formato della data il primo formato della data è aaaa-MM-gg hh : mm a zzz e il secondo formato della data sarà aaaa-MM-gg hh: mm a

restituisce semplicemente una stringa da questa funzione come.

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;
}

Questa funzione restituirà la risposta al tuo desiderio. Se vuoi personalizzare di più, aggiungi o rimuovi componente dal formato data.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.