Changer le format de date dans une chaîne Java


J'ai un String représentant une date.

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

Je voudrais le convertir en Date et le sortir au format YYYY-MM-DD.

2011-01-18

Comment puis-je y parvenir?


D'accord, sur la base des réponses que j'ai récupérées ci-dessous, voici quelque chose que j'ai essayé:

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

Mais il sort 02011-00-1 au lieu du 2011-01-18 souhaité. Ce que je fais mal?

Author: cнŝdk, 2011-01-23

19 answers

Utiliser LocalDateTime#parse() (ou ZonedDateTime#parse() si la chaîne contient un fuseau horaire de la partie) pour analyser un String dans un certain modèle dans 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"));

Utiliser LocalDateTime#format() (ou ZonedDateTime#format()) pour formater un LocalDateTime en String dans un certain modèle.

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

Ou, lorsque vous n'êtes pas sur Java 8, utilisation SimpleDateFormat#parse() pour analyser un String dans un certain modèle dans un Date.

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

Utiliser SimpleDateFormat#format() pour formater un Date en String dans un certain modèle.

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

Voir aussi:


Mise à Jour: selon votre tentative a échoué: les modèles sont sensible à la casse. Lire la java.text.SimpleDateFormat javadoc ce que les parties individuelles représente. Ainsi se trouve par exemple M pendant des mois et m pendant des minutes. En outre, les années existent de quatre chiffres yyyy, pas de cinq yyyyy. Regardez de plus près les extraits de code que j'ai postés ici ci-dessus.

 518
Author: BalusC, 2017-05-23 12:10:41

Le formatage est sensible à la CASSE, utilisez DONC MM pour le mois et non mm (c'est pour la minute) et aaaa Pour Référence vous pouvez utiliser la feuille de triche suivante.

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

Exemples:

"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
 163
Author: Dev, 2015-12-04 05:21:28

La réponse est bien sûr de créer un objet SimpleDateFormat et de l'utiliser pour analyser les chaînes à Date et formater les Dates en chaînes. Si vous avez essayé SimpleDateFormat et que cela n'a pas fonctionné, veuillez montrer votre code et les erreurs que vous pourriez recevoir.

Addendum: "mm" dans la chaîne de format n'est pas le même que "MM". Utiliser MM pendant des mois et mm pendant des minutes. De plus, aaaa n'est pas la même chose que aaaa. par exemple:

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

}
 110
Author: Hovercraft Full Of Eels, 2011-01-23 05:49:22

Pourquoi ne pas simplement utiliser ce

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

Aussi, c'est l'inverse:

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

Ou

Date requiredDate = df.format(new Date());
 27
Author: 89n3ur0n, 2020-06-22 16:01:34

Utilisation du paquet java.time dans Java 8 et versions ultérieures:

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);
 15
Author: Vitalii Fedorenko, 2014-09-12 17:09:57

[modifié pour inclure les corrections de BalusC] La classe SimpleDateFormat devrait faire l'affaire:

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();
}
 11
Author: Bryan, 2011-01-23 05:29:09

Veuillez consulter "Modèles de date et d'heure" ici. 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();
    }
  } 

}
 10
Author: Touchstone, 2015-03-13 10:39:10

Les autres réponses sont correctes, fondamentalement, vous aviez le mauvais nombre de caractères "y" dans votre modèle.

Fuseau horaire

Un autre problème cependant You Vous n'avez pas abordé les fuseaux horaires. Si vous aviez l'intention UTC, alors vous auriez dû le dire. Sinon, les réponses ne sont pas complètes. Si tout ce que vous voulez est la partie date sans l'heure, alors pas de problème. Mais si vous faites d'autres travaux qui peuvent impliquer du temps, alors vous devriez spécifier un fuseau horaire.

Joda-Temps

Voici le même type de code mais en utilisant la bibliothèque open-source tierce Joda-Time 2.3

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

Lors de l'exécution...

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
Author: Basil Bourque, 2013-11-30 05:27:32
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");
  }
 8
Author: Fathah Rehman P, 2014-01-07 02:41:14

Vous pouvez simplement utiliser:

Date yourDate = new Date();

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

Cela fonctionne parfaitement!

 8
Author: cнŝdk, 2014-05-26 16:40:58
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;
    }
}
 7
Author: Neeraj Gahlawat, 2019-07-17 12:36:19
   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
Author: Eren, 2012-05-26 14:55:45

Vous pouvez également utiliser substring ()

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

Si vous voulez un espace devant la date, utilisez

String date_s = " 2011-01-18 00:00:00.0";
date_s.substring(1,11);
 5
Author: Martin, 2013-10-12 09:08:18

Vous pouvez essayer de Java 8 nouveaux date, plus d'informations peuvent être trouvées sur le documentation Oracle.

Ou vous pouvez essayer l'ancien

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);
}
 5
Author: Ran Adler, 2019-09-18 04:11:53
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);
};
 4
Author: user2632575, 2013-07-30 04:29:47

Supprimer un y formulaire le format fournir à:

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

Il devrait être:

SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");
 3
Author: Pankaj Sharma, 2020-06-22 16:01:15

Dites que vous voulez changer 2019-12-20 10: 50 AM GMT + 6: 00 à 2019-12-20 10: 50 AM tout d'abord, vous devez comprendre le format de la date premier format de la date aaaa-MM-jj hh: mm a zzz et le deuxième format de date sera aaaa-MM-jj hh: mm a

Renvoie simplement une chaîne de cette fonction comme.

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

Cette fonction renverra votre réponse de désir. Si vous souhaitez personnaliser plus, ajoutez ou supprimez simplement un composant du format de date.

 0
Author: pavel, 2019-07-22 11:00:40

Nous pouvons convertir la date d'aujourd'hui au format 'JUN 12, 2020'.

String.valueOf(DateFormat.getDateInstance().format(new Date())));
 0
Author: Kamta Mishra, 2020-06-22 15:59:20
SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");
 -1
Author: Soumya Mahapatra, 2020-06-22 16:00:25