convertir la date du format « 2009-12 déc » à « 31-DEC-2009 »
-
27-09-2019 - |
Question
'2009-12 Dec' should be converted to '31-DEC-2009'
'2010-09 Sep' should be converted to '30-SEP-2010'
'2010-02 Feb' should be converted to '28-FEB-2010'
'2008-02 Feb' should be converted to '29-FEB-2008'
Les valeurs 2009-12 décembre , 2008-02 février sera affiché à l'utilisateur dans un bas de baisse. L'utilisateur a aucune option pour sélectionner le JOUR .
doit être adopté la valeur sélectionnée par l'utilisateur à la base de données. Mais la base de données attend la date dans le format DD-MMM-YYYY
. La requête a condition de "<= USER_DATE
. Ainsi, le dernier jour du mois doit être automatiquement sélectionné et transmis à la base de données.
aide Pl moi par écrit la fonction qui fait le travail ci-dessus.
static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM MMM");
public static String convertMapedToSqlFormat(final String maped) {
String convertedMaped = null;
//....
return convertedMaped;
}
@Test
public void testConvertMapedToSqlFormat() {
String[] mapedValues = { "2009-12 Dec", "2009-11 Nov", "2009-10 Oct",
"2009-09 Sep", "2009-08 Aug", "2009-07 Jul", "2009-06 Jun",
"2009-05 May", "2009-04 Apr", "2009-03 Mar", "2009-02 Feb",
"2009-01 Jan", "2008-12 Dec", "2008-11 Nov", "2008-10 Oct" };
for (String maped : mapedValues) {
System.out.println(convertMapedToSqlFormat(maped));
}
}
La solution
Convertir à Calendar
et l'utilisation Calendar#getActualMaximum()
pour obtenir dernier jour du mois et régler le jour avec elle.
Coup d'envoi par exemple:
String oldString = "2009-12 Dec";
Calendar calendar = Calendar.getInstance();
calendar.setTime(new SimpleDateFormat("yyyy-MM").parse(oldString)); // Yes, month name is ignored but we don't need this.
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
String newString = new SimpleDateFormat("dd-MMM-yyyy").format(calendar.getTime()).toUpperCase();
System.out.println(newString); // 31-DEC-2009
Autres conseils
- Utilisez votre
DateFormat
(mais le fixer àyyyy-dd MMM
) pour analyser la date - convertir le
Date
àCalendar
- Utilisez
Calendar.getActualMaximim()
- utiliser
dd-MMM-yyyy
pour formater la date d'obtention. - appel
.toUpperCase()
static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM MMM");
static SimpleDateFormat dbDateFormat = new SimpleDateFormat("yyyy-MMM-dd");
public static String convertMapedToSqlFormat(final String maped) {
Date date = dateFormat.parse(mapped);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
return dbDateFormat.format(cal.getTime()).toUpperCase();
}
Quelques notes:
- si possible, utiliser joda temps
DateTime
- éviter d'avoir des formats de date stricts dans la base de données.
Obtenez l'année et le mois de la partie AAAA-MM de la chaîne.
Utilisez JODA pour créer un point dans le temps correspondant au premier jour de ce mois. Avancer d'un mois et un jour en arrière. Aplatir le temps de la représentation de chaîne dont vous avez besoin.
Salut vous devez analyser votre date, comme si
SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
Date du = new Date();
du = df.parse(sDate);
df = new SimpleDateFormat("yyyy-MM-dd");
sDate = df.format(du);
Hope this helps. Permettez-moi de savoir si elle le fait.
PK
java.time
Beaucoup plus facile maintenant avec les classes de java.time modernes qui supplantent les classes ennuyeuses ancienne date-heure ici, à La question et d'autres réponses.
Le java.time cadre est construit en Java 8 et versions ultérieures. Ces classes remplacent les anciennes classes date temps gênants tels que java.util.Date
, .Calendar
, et java.text.SimpleDateFormat
.
Maintenant en mode maintenance le projet de Joda-Time conseille également la migration vers java.time.
Pour en savoir plus, consultez le Oracle Tutoriel . Et la recherche Stack Overflow pour de nombreux exemples et explications.
La plupart des fonctionnalités de java.time est de retour à Java 6 portage et 7 ThreeTen-Backport et en outre adapté pour applications ThreeTenABP .
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour des ajouts futurs possibles à java.time.
YearMonth
La classe YearMonth
fournit tout ce vous voulez.
YearMonth start = YearMonth.of( 2008 , Month.OCTOBER );
YearMonth stop = YearMonth.of( 2009 , Month.DECEMBER );
List<YearMonth> yms = new ArrayList<>();
YearMonth ym = start ;
while( ! ym.isAfter( stop ) ) {
yms.add( ym );
// Set up the next loop.
ym = ym.plusMonths( 1 );
}
A l'heure actuelle, utiliser un DateTimeFormatter
pour générer une représentation de chaîne de la valeur de YearMonth
.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM MMM" );
f = f.withLocale( Locale.CANADA_FRENCH ); // Or Locale.US etc.
String output = ym.format( f );
Pour obtenir le dernier jour du mois, interroger l'objet YearMonth
.
LocalDate endOfMonth = ym.atEndOfMonth();
Présenter, utiliser un DateTimeFormatter
. Soit laisser instancier un formatter qui vient se placer automatiquement appropriée à un Locale
spécifié, ou définir votre propre modèle de mise en forme. Montré à plusieurs reprises dans de nombreuses autres questions et réponses sur Stack Overflow.