Modifier le format de date dans une chaîne Java

J’ai une Ssortingng représentant une date.

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

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

2011-01-18

Comment puis-je atteindre cet objective?


Bon, d’après les réponses que j’ai récupérées ci-dessous, voici quelque chose que j’ai essayé:

 Ssortingng 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 produit 02011-00-1 au lieu de 2011-01-18 . Qu’est-ce que je fais mal?

Utilisez LocalDateTime#parse() (ou ZonedDateTime#parse() si la chaîne contient une partie de fuseau horaire) pour parsingr une Ssortingng d’un certain modèle dans un LocalDateTime .

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

Utilisez LocalDateTime#format() (ou ZonedDateTime#format() ) pour formater un LocalDateTime en une Ssortingng d’un certain modèle.

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

Ou , lorsque vous n’êtes pas encore sous Java 8, utilisez SimpleDateFormat#parse() pour parsingr une Ssortingng d’un certain modèle dans une Date .

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

Utilisez SimpleDateFormat#format() pour formater une Date en une Ssortingng dans un certain modèle.

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

Voir également:

  • Chaîne Java à la conversion de date

Mise à jour : selon votre tentative infructueuse: les modèles sont sensibles à la casse . Lisez le java.text.SimpleDateFormat javadoc que représentent les différentes parties. Ainsi, par exemple, M pour les mois et m pour les minutes. En outre, il existe des années de quatre chiffres yyyy et non pas cinq yyyyy . Regardez de plus près les extraits de code que j’ai publiés ci-dessus.

Le formatage est SENSIBLE, UTILISEZ MM pour le mois et non pour le mois (c’est pour les minutes) et aaaa. Pour référence, vous pouvez utiliser la feuille de traitement 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 

La réponse est bien sûr de créer un object SimpleDateFormat et de l’utiliser pour parsingr les chaînes à la date et formater les dates en chaînes. Si vous avez essayé SimpleDateFormat et que cela n’a pas fonctionné, veuillez afficher votre code et toute erreur que vous pourriez recevoir.

Addendum: “mm” au format Ssortingng n’est pas la même chose que “MM”. Utilisez MM pour les mois et mm pour les minutes. De plus, yyyyy 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(Ssortingng[] args) throws ParseException { Ssortingng 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 Ssortingng below SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); System.out.println(dt1.format(date)); } } 

Pourquoi ne pas simplement utiliser cette

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

En outre, c’est le contraire:

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

ou

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

À votre santé!

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

 Ssortingng 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 Ssortingng output = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(temporal); 

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

 Ssortingng 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(); } 
 public class SystemDateTest { Ssortingng ssortingngDate; public static void main(Ssortingng[] args) { SystemDateTest systemDateTest = new SystemDateTest(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss"); systemDateTest.setSsortingngDate(simpleDateFormat.format(systemDateTest.getDate())); System.out.println(systemDateTest.getSsortingngDate()); } public Date getDate() { return new Date(); } public Ssortingng getSsortingngDate() { return ssortingngDate; } public void setSsortingngDate(Ssortingng ssortingngDate) { this.ssortingngDate = ssortingngDate; } } 
 try { Ssortingng 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"); } 

Veuillez vous référer aux “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(Ssortingng 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(); } } } 

Les autres réponses sont correctes. En gros, vous avez un nombre incorrect de caractères “y” dans votre modèle.

Fuseau horaire

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

Joda-Time

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

 // © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. Ssortingng 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 ssortingng conformed ssortingctly 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 ssortingng 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 ssortingng 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 ) ); 

Quand courir…

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

Vous pouvez également utiliser la sous-chaîne ()

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

Si vous voulez un espace devant la date, utilisez

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

Vous pouvez simplement utiliser:

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

Cela fonctionne parfaitement!

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

supprimer une forme SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd"); devrait être SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");

Vous pouvez essayer java 8 new date , plus d’informations peuvent être trouvées sur la documentation d’Oracle .

Ou vous pouvez essayer l’ancien

 public static Date getDateFromSsortingng(Ssortingng format, Ssortingng dateStr) { DateFormat formatter = new SimpleDateFormat(format); Date date = null; try { date = (Date) formatter.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } return date; } public static Ssortingng getDate(Date date, Ssortingng dateFormat) { DateFormat formatter = new SimpleDateFormat(dateFormat); return formatter.format(date); }