views:

117

answers:

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'

The values 2009-12 Dec, 2008-02 Feb will be displayed to the User in a drop down. The User have no option to select the DAY.

The user selected value should be passed to the Database. But the database expects the date in the format DD-MMM-YYYY. The query has '<= USER_DATE' condition. So, the last day of the month should be automatically selected and passed to the database.

Pl help me in writing the function that does the above job.

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

Hi you have to parse your date, like so

      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. Let me know if it does.

PK

Pavan
There's no "day" part to parse.
MSalters
Please don't LOL the answers of others.
Thorbjørn Ravn Andersen
+2  A: 
  • Use your DateFormat (but fix it to yyyy-dd MMM) to parse the date
  • convert the Date to Calendar
  • Use Calendar.getActualMaximim()
  • use dd-MMM-yyyy to format the obtained date.
  • call .toUpperCase()

So:

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

A few notes:

  • if possible use joda-time DateTime
  • avoid having strict date formats in the database.
Bozho
How do you get the last-day-of-the-month part?
Thorbjørn Ravn Andersen
edit the post. you wrote dd/mmm/yyyy loll
Pavan
@Paven Please use real language. lol is not appropriate here
seanizer
@Bozho: small correction - return dbDateFormat.format(date.getTime()); should be return dbDateFormat.format(cal.getTime());
HanuAthena
@HanuAthena thanks, corrected
Bozho
+1  A: 

Get the year and month from the YYYY-MM part of the string.

Use JODA to create a point in time corresponding to the first day of that month. Move one month forward, and one day backward. Flatten the time to the string representation you need.

Thorbjørn Ravn Andersen
Move one month forward and use `<`, otherwise you lose any events that occur on the final day of the month at any time other than exactly midnight.
Ben Voigt
+6  A: 

Convert it to Calendar and use Calendar#getActualMaximum() to obtain last day of month and set the day with it.

Kickoff example:

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
BalusC
+1, I totally forgot about `calendar.getActualMaximum()`
Bozho