package com.roomorama.caldroid;
import hirondelle.date4j.DateTime;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
/**
* Convenient helper to work with date, JODA DateTime and String
*
* @author thomasdao
*
*/
public class CalendarHelper {
/**
* Retrieve all the dates for a given calendar month Include previous month,
* current month and next month.
*
* @param month
* @param year
* @param startDayOfWeek
* : calendar can start from customized date instead of Sunday
* @return
*/
public static SimpleDateFormat yyyyMMddFormat = new SimpleDateFormat(
"yyyy-MM-dd", Locale.ENGLISH);;
public static ArrayList<DateTime> getFullWeeks(int month, int year,
int startDayOfWeek) {
ArrayList<DateTime> datetimeList = new ArrayList<DateTime>();
DateTime firstDateOfMonth = new DateTime(year, month, 1, 0, 0, 0, 0);
DateTime lastDateOfMonth = firstDateOfMonth.getEndOfMonth();
// Add dates of first week from previous month
int weekdayOfFirstDate = firstDateOfMonth.getWeekDay();
// If weekdayOfFirstDate smaller than startDayOfWeek
// For e.g: weekdayFirstDate is Monday, startDayOfWeek is Tuesday
// increase the weekday of FirstDate because it's in the future
if (weekdayOfFirstDate < startDayOfWeek) {
weekdayOfFirstDate += 7;
}
while (weekdayOfFirstDate > 0) {
DateTime dateTime = firstDateOfMonth.minusDays(weekdayOfFirstDate
- startDayOfWeek);
if (!dateTime.lt(firstDateOfMonth)) {
break;
}
datetimeList.add(dateTime);
weekdayOfFirstDate--;
}
// Add dates of current month
for (int i = 0; i < lastDateOfMonth.getDay(); i++) {
datetimeList.add(firstDateOfMonth.plusDays(i));
}
// Add dates of last week from next month
int endDayOfWeek = startDayOfWeek - 1;
if (endDayOfWeek == 0) {
endDayOfWeek = 7;
}
if (lastDateOfMonth.getWeekDay() != endDayOfWeek) {
int i = 1;
while (true) {
DateTime nextDay = lastDateOfMonth.plusDays(i);
datetimeList.add(nextDay);
i++;
if (nextDay.getWeekDay() == endDayOfWeek) {
break;
}
}
}
return datetimeList;
}
/**
* Get the DateTime from Date, with hour and min is 0
*
* @param date
* @return
*/
public static DateTime convertDateToDateTime(Date date) {
DateTime dateTime = new DateTime(yyyyMMddFormat.format(date));
dateTime = new DateTime(dateTime.getYear(), dateTime.getMonth(),
dateTime.getDay(), 0, 0, 0, 0);
return dateTime;
}
public static Date convertDateTimeToDate(DateTime dateTime) {
String dateString = dateTime.format("YYYY-MM-DD");
try {
return getDateFromString(dateString, null);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* Get the Date from String with custom format. Default format is yyyy-MM-dd
*
* @param dateString
* @param dateFormat
* @return
* @throws ParseException
*/
public static Date getDateFromString(String dateString, String dateFormat)
throws ParseException {
SimpleDateFormat formatter;
if (dateFormat == null) {
formatter = yyyyMMddFormat;
} else {
formatter = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
}
return formatter.parse(dateString);
}
/**
* Get the DateTime from String with custom format. Default format is
* yyyy-MM-dd
*
* @param dateString
* @param dateFormat
* @return
*/
public static DateTime getDateTimeFromString(String dateString,
String dateFormat) {
Date date;
try {
date = getDateFromString(dateString, dateFormat);
return convertDateToDateTime(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static ArrayList<String> convertToStringList(
ArrayList<DateTime> dateTimes) {
ArrayList<String> list = new ArrayList<String>();
for (DateTime dateTime : dateTimes) {
list.add(dateTime.format("YYYY-MM-DD"));
}
return list;
}
}