java.util.Date conversion du format aaaa-mm-jj en mm-jj-aaaa

88

J'ai un java.util.Datedans le format yyyy-mm-dd. Je veux que ce soit au formatmm-dd-yyyy

Voici l'exemple d'utilitaire que j'ai essayé pour cette conversion:

// Setting the pattern
SimpleDateFormat sm = new SimpleDateFormat("mm-dd-yyyy");
// myDate is the java.util.Date in yyyy-mm-dd format
// Converting it into String using formatter
String strDate = sm.format(myDate);
//Converting the String back to java.util.Date
Date dt = sm.parse(strDate);

La sortie que j'obtiens n'est toujours pas au format mm-dd-yyyy.

Veuillez me faire savoir comment formater un java.util.Datede yyyy-mm-ddàmm-dd-yyyy

user182944
la source
2
Que voulez-vous dire quand vous dites ... J'ai un java.util.Date au format aaaa-mm-jj?
Jayamohan
Cela signifie que le format actuel de mon code pour l'afficher dans l'interface utilisateur est yyyy-mm-dd.
user182944
1
veuillez changer petit mm en MM
Dilip D

Réponses:

157

Date est un conteneur pour le nombre de millisecondes depuis l'époque Unix (00:00:00 UTC le 1er janvier 1970).

Il n'a aucune notion de format.

Java 8+

LocalDateTime ldt = LocalDateTime.now();
System.out.println(DateTimeFormatter.ofPattern("MM-dd-yyyy", Locale.ENGLISH).format(ldt));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH).format(ldt));
System.out.println(ldt);

Les sorties...

05-11-2018
2018-05-11
2018-05-11T17:24:42.980

Java 7-

Vous devriez utiliser le Backport ThreeTen

Réponse originale

Par exemple...

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

Les sorties...

Wed Aug 28 16:20:39 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 16:20:39 EST 2013

Aucune des mises en forme n'a modifié la Datevaleur sous-jacente . Tel est le but de la DateFormatters

Mis à jour avec un exemple supplémentaire

Juste au cas où le premier exemple n'aurait pas de sens ...

Cet exemple utilise deux formateurs pour mettre en forme la même date. J'utilise ensuite ces mêmes formateurs pour analyser les Stringvaleurs en Dates. L'analyse qui en résulte ne modifie pas la façon dont Dateelle rapporte sa valeur.

Date#toStringest juste une décharge de son contenu. Vous ne pouvez pas changer cela, mais vous pouvez formater l' Dateobjet comme vous le souhaitez

try {
    Date myDate = new Date();
    System.out.println(myDate);

    SimpleDateFormat mdyFormat = new SimpleDateFormat("MM-dd-yyyy");
    SimpleDateFormat dmyFormat = new SimpleDateFormat("yyyy-MM-dd");

    // Format the date to Strings
    String mdy = mdyFormat.format(myDate);
    String dmy = dmyFormat.format(myDate);

    // Results...
    System.out.println(mdy);
    System.out.println(dmy);
    // Parse the Strings back to dates
    // Note, the formats don't "stick" with the Date value
    System.out.println(mdyFormat.parse(mdy));
    System.out.println(dmyFormat.parse(dmy));
} catch (ParseException exp) {
    exp.printStackTrace();
}

Quelles sorties ...

Wed Aug 28 16:24:54 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 00:00:00 EST 2013
Wed Aug 28 00:00:00 EST 2013

Faites également attention aux modèles de format. Regardez de plus près SimpleDateFormatpour vous assurer que vous n'utilisez pas les mauvais modèles;)

MadProgrammer
la source
Une excellente réponse m'a aidé. J'essayais d'exécuter un exemple d'application de ligne de commande pour tester les formats (avant de l'utiliser dans une classe Android) - je n'ai pas trouvé l'importation dont j'avais besoin. Aucune des réponses fournies ne se souvient d'inclure cela: import java.text.SimpleDateFormat;
raddevus
34
SimpleDateFormat("MM-dd-yyyy");

au lieu de

SimpleDateFormat("mm-dd-yyyy");

parce que MM points Month,mm points minutes

SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);
nouvel utilisateur
la source
En dehors de ce changement, un autre changement que je dois apporter à la méthode util ci-dessus? Je ne suis pas en mesure de le tester tout de suite, d'où la question. Existe-t-il également un meilleur moyen de formater le java.util.Date?
user182944
15

'M' (Capital) représente le mois et 'm' (Simple) représente les minutes

Un exemple pendant des mois

'M' -> 7  (without prefix 0 if it is single digit)
'M' -> 12

'MM' -> 07 (with prefix 0 if it is single digit)
'MM' -> 12

'MMM' -> Jul (display with 3 character)

'MMMM' -> December (display with full name)

Un exemple pour quelques minutes

'm' -> 3  (without prefix 0 if it is single digit)
'm' -> 19
'mm' -> 03 (with prefix 0 if it is single digit)
'mm' -> 19
darshakat
la source
3

tl; dr

LocalDate.parse( 
    "01-23-2017" , 
    DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)

Détails

J'ai un java.util.Date au format aaaa-mm-jj

Comme d'autres l'ont mentionné, la Dateclasse n'a pas de format. Il a un compte de millisecondes depuis le début de 1970 en UTC. Sans attaches.

java.time

Les autres réponses utilisent d'anciennes classes de date-heure héritées gênantes, désormais supplantées par les classes java.time.

Si vous avez un java.util.Date, convertissez-le en Instantobjet. La Instantclasse représente un moment sur la chronologie en UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).

Instant instant = myUtilDate.toInstant();

Fuseau horaire

Les autres réponses ignorent la question cruciale du fuseau horaire. La détermination d'une date nécessite un fuseau horaire. Pour un moment donné, la date varie dans le monde entier par zone. Quelques minutes après minuit à Paris, la France est un nouveau jour, alors qu'il est encore «hier» à Montréal Québec.

Définissez le fuseau horaire selon lequel vous voulez un contexte pour votre Instant.

ZoneId z = ZoneId.of( "America/Montreal" );

Appliquez le ZoneIdpour obtenir un ZonedDateTime.

ZonedDateTime zdt = instant.atZone( z );

LocalDate

Si vous ne vous souciez que de la date sans heure, extrayez un fichier LocalDate.

LocalDate localDate = zdt.toLocalDate();

Pour générer une chaîne au format standard ISO 8601, AAAA-MM-JJ, appelez simplement toString. Les classes java.time utilisent les formats standard par défaut lors de la génération / analyse des chaînes.

String output = localDate.toString();

23/01/2017

Si vous souhaitez un format MM-JJ-AAAA, définissez un modèle de mise en forme.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );

Notez que les codes de modèle de formatage sont sensibles à la casse. Le code de la question est incorrectement utilisé mm(minute de l'heure) plutôt que MM(mois de l'année).

Utilisez le même DateTimeFormatterobjet pour l'analyse. Les classes java.time sont thread-safe, vous pouvez donc conserver cet objet et le réutiliser à plusieurs reprises même entre les threads.

LocalDate localDate = LocalDate.parse( "01-23-2017" , f );

À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, et SimpleDateFormat.

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .

Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes java.time?

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .

Basil Bourque
la source
1

C'est une utilisation simple ci-dessous les codes.

final Date todayDate = new Date();

System.out.println(todayDate);

System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(todayDate));

System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(todayDate));

System.out.println(todayDate);
Ujitha
la source
(A) Ce code ignore la question cruciale des fuseaux horaires. (B) Ce code utilise d'anciennes classes de date-heure gênantes qui sont héritées depuis des années maintenant. Évite-les. Fourni par les classes java.time.
Basil Bourque du
1

Vous pouvez obtenir le jour, le mois et l'année et les concaténer ou utiliser le format MM-jj-aaaa comme indiqué ci-dessous.

Date date1 = new Date();
String mmddyyyy1 = new SimpleDateFormat("MM-dd-yyyy").format(date1);
System.out.println("Formatted Date 1: " + mmddyyyy1);



Date date2 = new Date();
Calendar calendar1 = new GregorianCalendar();
calendar1.setTime(date2);
int day1   = calendar1.get(Calendar.DAY_OF_MONTH);
int month1 = calendar1.get(Calendar.MONTH) + 1; // {0 - 11}
int year1  = calendar1.get(Calendar.YEAR);
String mmddyyyy2 = ((month1<10)?"0"+month1:month1) + "-" + ((day1<10)?"0"+day1:day1) + "-" + (year1);
System.out.println("Formatted Date 2: " + mmddyyyy2);



LocalDateTime ldt1 = LocalDateTime.now();  
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy3 = ldt1.format(format1);  
System.out.println("Formatted Date 3: " + mmddyyyy3);  



LocalDateTime ldt2 = LocalDateTime.now();
int day2 = ldt2.getDayOfMonth();
int mont2= ldt2.getMonthValue();
int year2= ldt2.getYear();
String mmddyyyy4 = ((mont2<10)?"0"+mont2:mont2) + "-" + ((day2<10)?"0"+day2:day2) + "-" + (year2);
System.out.println("Formatted Date 4: " + mmddyyyy4);



LocalDateTime ldt3 = LocalDateTime.of(2020, 6, 11, 14, 30); // int year, int month, int dayOfMonth, int hour, int minute
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy5 = ldt3.format(format2);   
System.out.println("Formatted Date 5: " + mmddyyyy5); 



Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(new Date());
int day3  = calendar2.get(Calendar.DAY_OF_MONTH); // OR Calendar.DATE
int month3= calendar2.get(Calendar.MONTH) + 1;
int year3 = calendar2.get(Calendar.YEAR);
String mmddyyyy6 = ((month3<10)?"0"+month3:month3) + "-" + ((day3<10)?"0"+day3:day3) + "-" + (year3);
System.out.println("Formatted Date 6: " + mmddyyyy6);



Date date3 = new Date();
LocalDate ld1 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date3)); // Accepts only yyyy-MM-dd
int day4  = ld1.getDayOfMonth();
int month4= ld1.getMonthValue();
int year4 = ld1.getYear();
String mmddyyyy7 = ((month4<10)?"0"+month4:month4) + "-" + ((day4<10)?"0"+day4:day4) + "-" + (year4);
System.out.println("Formatted Date 7: " + mmddyyyy7);



Date date4 = new Date();
int day5   = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getDayOfMonth();
int month5 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getMonthValue();
int year5  = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getYear();
String mmddyyyy8 = ((month5<10)?"0"+month5:month5) + "-" + ((day5<10)?"0"+day5:day5) + "-" + (year5);
System.out.println("Formatted Date 8: " + mmddyyyy8);



Date date5 = new Date();
int day6   = Integer.parseInt(new SimpleDateFormat("dd").format(date5));
int month6 = Integer.parseInt(new SimpleDateFormat("MM").format(date5));
int year6  = Integer.parseInt(new SimpleDateFormat("yyyy").format(date5));
String mmddyyyy9 = ((month6<10)?"0"+month6:month6) + "-" + ((day6<10)?"0"+day6:day6) + "-" + (year6);`enter code here`
System.out.println("Formatted Date 9: " + mmddyyyy9);
fnizami
la source
1

S'il vous plaît changer le petit mois "mm" en capital "MM" cela fonctionnera. Pour référence ci-dessous est l'exemple de code.

        Date myDate = new Date();
        SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
       
        String strDate = sm.format(myDate);
        
        Date dt = sm.parse(strDate);
        System.out.println(strDate);
Dilip D
la source