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));
        }
    }
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top