'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));
}
}
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
- 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.
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.
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
java.time
Much easier now with the modern java.time classes that supplant the troublesome old date-time classes seen here in the Question and other Answers.
The java.time framework is built into Java 8 and later. These classes supplant the old troublesome date-time classes such as java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
.
Now in maintenance mode, the Joda-Time project also advises migration to java.time.
To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations.
Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport and further adapted to Android in ThreeTenABP.
The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time.
YearMonth
The YearMonth
class provides just what you want.
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 );
}
To present, use a DateTimeFormatter
to generate a String representation of the YearMonth
value.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM MMM" );
f = f.withLocale( Locale.CANADA_FRENCH ); // Or Locale.US etc.
String output = ym.format( f );
To get the last day of the month, interrogate the YearMonth
object.
LocalDate endOfMonth = ym.atEndOfMonth();
To present, use a DateTimeFormatter
. Either let instantiate a formatter that automatically localizes appropriate to a specified Locale
, or specify your own formatting pattern. Shown many times in many other Questions and Answers on Stack Overflow.