2010-10-01 19 views
4
'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 menu déroulant. L'utilisateur n'a aucune option pour sélectionner le JOUR.date de conversion de "2009-12 dec" format "31-DEC-2009"

La valeur sélectionnée par l'utilisateur doit être transmise à la base de données. Mais la base de données attend la date au format DD-MMM-YYYY. La requête a la condition '<= USER_DATE'. Ainsi, le dernier jour du mois doit être automatiquement sélectionné et transmis à la base de données.

Pl m'aider à écrire 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)); 
     } 
    } 
+0

typo dans votre échantillon de 2008 là-bas. –

+0

@martin clayton: l'a corrigé. Merci :) – HanuAthena

+0

Vraiment, vous devez utiliser '<' et le premier jour du mois suivant, sinon vous perdez des événements dans le dernier jour du mois. Exemple '2009-12-31T13: 00: 00' devrait tomber dans la gamme' 2009-12 Dec', mais avec votre méthode, il ne l'est pas. –

Répondre

7

Convertissez-le en Calendar et utilisez Calendar#getActualMaximum() pour obtenir le dernier jour du mois et définir le jour avec.

exemple Coup d'envoi:

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 
+1

+1, j'ai complètement oublié 'calendar.getActualMaximum()' – Bozho

0

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. Dites-moi si c'est le cas.

PK

+1

Il n'y a pas de partie "jour" à analyser. – MSalters

+1

S'il vous plaît ne pas LOL les réponses des autres. –

2
  • Utilisez votre DateFormat (mais le fixer à yyyy-dd MMM) pour analyser la date
  • convertir le Date à Calendar
  • Utilisez Calendar.getActualMaximim()
  • utilisation dd-MMM-yyyy pour formater la date obtenue .
  • appel .toUpperCase()

Alors:

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 l'utilisation joda-timeDateTime
  • éviter d'avoir des formats de date stricts dans la base de données.
+0

Comment obtenez-vous la partie du dernier jour du mois? –

+0

éditer le post. vous avez écrit jj/mmm/yyyy loll – Pavan

+0

@Paven Veuillez utiliser un langage réel. lol n'est pas approprié ici –

1

Récupère l'année et le mois de la partie YYYY-MM de la chaîne.

Utilisez JODA pour créer un point dans le temps correspondant au premier jour de ce mois. Déplacez un mois en avant, et un jour en arrière. Aplatissez le temps à la représentation de chaîne dont vous avez besoin.

+0

Déplacer un mois vers l'avant et utiliser '<', sinon vous perdez tous les événements qui se produisent le dernier jour du mois à tout moment autre que exactement minuit. –

0

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 framework java.time est intégré à Java 8 et versions ultérieures. Ces classes remplacent les anciennes classes de date-heure gênantes telles que java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Maintenant, dans maintenance mode, le projet Joda-Time conseille également la migration vers java.time.

Pour en savoir plus, voir le Oracle Tutorial. Et recherchez Stack Overflow pour de nombreux exemples et explications.

Une grande partie de la fonctionnalité de java.time est à nouveau porté à Java-6 & 7 dans ThreeTen-Backport et en outre adapté pour Android en ThreeTenABP.

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time.

YearMonth

La classe YearMonth fournit tout ce que 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); 
} 

Présenter, utiliser un DateTimeFormatter pour générer une représentation de chaîne de la valeur 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ésent, utilisez un DateTimeFormatter. Laissez soit instancier un formateur qui localise automatiquement approprié à un Locale spécifié, ou spécifiez votre propre modèle de formatage. Montré plusieurs fois dans beaucoup d'autres questions et réponses sur le débordement de pile.