Changer le format de date dans une chaîne Java


465

J'ai un Stringreprésentant une date.

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

Je voudrais le convertir en un Dateet le sortir au YYYY-MM-DDformat.

2011-01-18

Comment puis-je atteindre cet objectif?


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-1au lieu du souhaité 2011-01-18. Qu'est-ce que je fais mal?


163
aaaa n'est pas la même chose que aaaa. :)
Hovercraft Full Of Eels

2
Une question boomerang. Quel est votre cas d'utilisation? Parce qu'il est possible que vous utilisiez des modèles intégrés (DateFormat.getDateTimeInstance ()).
Paweł Dyda

11
Le mois est représenté avec MM dans la chaîne de format, pas avec mm comme dans les exemples ci-dessus. mm signifie minutes.
Mike

3
J'ai changé aaaa-mm-jj en aaaa-MM-jj, car la version initiale n'a pas fonctionné
Pavlo Zvarych

Réponses:


506

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

Utilisez LocalDateTime#format()(ou ZonedDateTime#format()) pour formater un LocalDateTimedans un Stringdans 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 encore sur Java 8, utilisez SimpleDateFormat#parse()pour analyser a Stringdans un certain modèle en a Date.

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

Utilisez SimpleDateFormat#format()pour formater un Datedans un Stringdans un certain modèle.

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

Voir également:


Mise à jour : selon votre tentative échouée: les modèles sont sensibles à la casse . Lisez le java.text.SimpleDateFormatjavadoc ce que représentent les différentes pièces. Il en est ainsi par exemple Mdes mois et mdes minutes. De plus, il existe des années à quatre chiffres yyyyet non à cinq yyyyy. Regardez de plus près les extraits de code que j'ai publiés ci-dessus.


Et si vous voulez que la date ressemble à "lundi 1er septembre 2012"?
crmepham

11
@crm: il suffit de cliquer sur le lien javadoc, d'y trouver les caractères de motif nécessaires et de modifier le motif en conséquence.
BalusC

Lorsque vous n'êtes pas encore sur Java 8, pensez à utiliser le backport, ThreeTen Backport , puis les premiers exemples de la réponse. Ou pour Android sous le niveau d'API 26, ThreeTenABP .
Ole VV

157

Le formatage est SENSIBLE À LA CASE donc UTILISEZ MM pour le mois et non pour le mm (c'est pour la minute) et yyyy 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

1
"aaaa-MM-jj'T'HH: mm: ss.SSSZ" devrait être "aaaa-MM-jj'T'HH: mm: ss.SSS'Z '"
un joueur honnête du

2
non si vous mettez Z entre guillemets simples, cela donnera Z en sortie mais sans lui, cela donnera le fuseau horaire. par exemple. 2014-08-14T01: 24: 57.236Z et de l'extérieur 2014-08-14T01: 24: 57.236-0530 -> J'ai essayé sur jdk1.7
Dev

1
"aaaaa.MMMMM.dd GGG hh: mm aaa" 02001.July.04 AD 12:08 PM Remarque M supplémentaire dans le mois. Quatre pas cinq!
Stefano Mtangoo

s'il s'agit de 4 lettres ou plus, le formulaire complet est utilisé. vous pouvez donc utiliser 4 fois m ou même 5 fois m la même
Dev

Ceci est à peu près un copier-coller des documents. Aucune explication supplémentaire n'est fournie, et il n'y a pas de lien vers les documents où plus d'informations pourraient être acquises si nécessaire. -1. ( Voici le lien btw )
XenoRo

108

La réponse est bien sûr de créer un objet SimpleDateFormat et de l'utiliser pour analyser les chaînes en 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 toutes les erreurs que vous pourriez recevoir.

Addendum: "mm" au format String n'est pas le même que "MM". Utilisez MM pour les mois et mm pour les 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));
    }

}

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; classe publique formateDate {/ ** * @param args * @throws ParseException * / public static void main (String [] args) lève ParseException {// TODO Méthode générée automatiquement stub String chaîne date_s = "2011-01-18 00:00 : 00.0 "; SimpleDateFormat dt = new SimpleDateFormat ("aaaa-mm-jj hh: mm: ss"); Date date = dt.parse (date_s); SimpleDateFormat dt1 = nouveau SimpleDateFormat ("aaaaa-mm-jj"); System.out.println (dt1.format (date)); }} Je veux que le résultat soit "2011-01-18" mais le résultat soit 02011-00-1
amit4444

Publiez tout code que vous avez en plus de la question d'origine (quatre espaces en retrait). De cette façon, il conservera sa mise en forme et nous pourrons ensuite le lire.
Hovercraft Full Of Eels

1
Voir modifier ma réponse ci-dessus. Vous utilisez "mm" dans votre chaîne de format où vous devriez utiliser "MM"
Hovercraft Full Of Eels

hhvous donnera l'heure dans la plage 1-12, vous devrez utiliser aen plus d'imprimer / analyser AMou PM. Pour imprimer / analyser l'heure dans la plage 0-23, utilisez HH.
Andre Holzner

22

Pourquoi ne pas simplement l'utiliser

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

C'est aussi l'autre façon:

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

ou

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

À votre santé!


2
Pourquoi ne pas l'utiliser? Parce que (a) il ignore la question du fuseau horaire. La détermination de la date dépend du fuseau horaire. Ce code dépend du fuseau horaire par défaut de la JVM. Les résultats peuvent donc varier par inadvertance. Et (b) parce que les classes java.util.Date et SimpleDateFormat sont notoirement gênantes et doivent être évitées.
Basil Bourque

2
toujours renvoyer strin, Date requiredDate = df.format (new Date ());
livrez le

15

Utilisation du java.timepackage 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);

9

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

DDsignifie "jour dans l'année", pas "jour dans le mois". hhsignifie "heure en am / pm (1-12)", pas "heure en jour (0-23)".
BalusC

9

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

Fuseau horaire

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

Joda-Time

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

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

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

}

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
Veuillez ajouter quelques informations à vos réponses pour expliquer votre code.
Kursad Gulseven

il y a un nom de méthode getDate () par lequel vous pouvez obtenir la date obj après cela appliquer SimpleDateFormat afin que vous puissiez convertir la date selon votre format qui est défini dans le constructeur SimpleDateFormat et défini dans la méthode StringDate, vous pouvez le mettre en 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

Vous pouvez simplement utiliser:

Date yourDate = new Date();

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

Ça marche parfaitement!


5

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

Vous pouvez essayer Java 8 nouveau date, plus d'informations peuvent être trouvées sur la 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);
}

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

supprimer un formulaire y SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");doit êtreSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


Pas exactement. Vous avez également besoin du bon boîtier (que vous utilisiez le moderne DateTimeFormatterou que vous vous accrochiez au dépassé SimpleDateFormat).
Ole VV

0

SimpleDateFormat dt1 = nouveau SimpleDateFormat ("aaaa-mm-jj");


Cette classe date-heure a été remplacée il y a des années par les classes modernes java.time . Plus précisément DateTimeFormatteret DateTimeFormatterBuilder. Suggérer SimpleDateFormaten 2019 est un mauvais conseil.
Basil Bourque

Incorrect Vos codes de formatage ici sont incorrects. hhest pour l'heure.
Basil Bourque

Habituellement, nous attendons une discussion ou une explication. Stack Overflow est censé être plus qu'une bibliothèque d'extraits de code.
Basil Bourque

0

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

il suffit de retourner 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 désirée. Si vous souhaitez personnaliser davantage, ajoutez ou supprimez simplement un composant du format de date.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.