Date
objects into RFC2822 and UTC ('Zulu') strings, and to
* build Date
objects starting from string representations of
* dates in RFC2822 and UTC format
*/
public class MailDateFormatter {
/** Format date as: MM/DD */
public static final int FORMAT_MONTH_DAY = 0;
/** Format date as: MM/DD/YYYY */
public static final int FORMAT_MONTH_DAY_YEAR = 1;
/** Format date as: hh:mm */
public static final int FORMAT_HOURS_MINUTES = 2;
/** Format date as: hh:mm:ss */
public static final int FORMAT_HOURS_MINUTES_SECONDS = 3;
/** Format date as: DD/MM */
public static final int FORMAT_DAY_MONTH = 4;
/** Format date as: DD/MM/YYYY */
public static final int FORMAT_DAY_MONTH_YEAR = 5;
/** Device offset, as string */
private static String deviceOffset = "+0000";
/** Device offset, in millis */
private static long millisDeviceOffset = 0;
/** Names of the months */
private static String[] monthNames = new String[] {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
/**
* Transforms data contained in a Date
object (expressed in
* UTC) in a string formatted as per RFC2822 in local time (par. 3.3)
*
* @return A string representing the date contained in the passed
* Date
object formatted as per RFC 2822 and in local
* time
*/
public static String dateToRfc2822(Date date) {
Calendar deviceTime = Calendar.getInstance();
deviceTime.setTime(date);
String dayweek = "";
int dayOfWeek = deviceTime.get(deviceTime.DAY_OF_WEEK);
switch (dayOfWeek) {
case 1 : dayweek = "Sun"; break;
case 2 : dayweek = "Mon"; break;
case 3 : dayweek = "Tue"; break;
case 4 : dayweek = "Wed"; break;
case 5 : dayweek = "Thu"; break;
case 6 : dayweek = "Fri"; break;
case 7 : dayweek = "Sat"; break;
}
int dayOfMonth = deviceTime.get(deviceTime.DAY_OF_MONTH);
String monthInYear = getMonthName(deviceTime.get(deviceTime.MONTH));
int year = deviceTime.get(deviceTime.YEAR);
int hourOfDay = deviceTime.get(deviceTime.HOUR_OF_DAY);
int minutes = deviceTime.get(deviceTime.MINUTE);
int seconds = deviceTime.get(deviceTime.SECOND);
String rfc = dayweek + ", " + // Tue
dayOfMonth + " " + // 7
monthInYear + " " + // Nov
year + " " + // 2006
hourOfDay + ":" + minutes + ":" + seconds + " " + // 14:13:26
deviceOffset; //+0200
return rfc;
}
/**
* Converts a Date
object into a string in 'Zulu' format
*
* @param d
* A Date
object to be converted into a string in
* 'Zulu' format
* @return A string representing the date contained in the passed
* Date
object in 'Zulu' format (e.g.
* yyyyMMDDThhmmssZ)
*/
public static String dateToUTC(Date d) {
StringBuffer date = new StringBuffer();
Calendar cal = Calendar.getInstance();
cal.setTime(d);
date.append(cal.get(Calendar.YEAR));
date.append(printTwoDigits(cal.get(Calendar.MONTH) + 1))
.append(printTwoDigits(cal.get(Calendar.DATE)))
.append("T");
date.append(printTwoDigits(cal.get(Calendar.HOUR_OF_DAY)))
.append(printTwoDigits(cal.get(Calendar.MINUTE)))
.append(printTwoDigits(cal.get(Calendar.SECOND)))
.append("Z");
return date.toString();
}
/**
* A method that returns a string rapresenting a date.
*
* @param date the date
*
* @param format the format as one of
* FORMAT_MONTH_DAY,
* FORMAT_MONTH_DAY_YEAR,
* FORMAT_HOURS_MINUTES,
* FORMAT_HOURS_MINUTES_SECONDS
* FORMAT_DAY_MONTH
* FORMAT_DAY_MONTH_YEAR
* constants
*
* @param separator the separator to be used
*/
public static String getFormattedStringFromDate(
Date date, int format, String separator) {
Calendar cal=Calendar.getInstance();
cal.setTime(date);
StringBuffer ret = new StringBuffer();
switch (format) {
case FORMAT_HOURS_MINUTES:
//if pm and hour == 0 we want to write 12, not 0
if (cal.get(Calendar.AM_PM)==Calendar.PM
&& cal.get(Calendar.HOUR) == 0) {
ret.append("12");
} else {
ret.append(cal.get(Calendar.HOUR));
}
ret.append(separator)
.append(printTwoDigits(cal.get(Calendar.MINUTE)))
.append(getAMPM(cal));
break;
case FORMAT_HOURS_MINUTES_SECONDS:
//if pm and hour == 0 we want to write 12, not 0
if (cal.get(Calendar.AM_PM)==Calendar.PM
&& cal.get(Calendar.HOUR) == 0) {
ret.append("12");
} else {
ret.append(cal.get(Calendar.HOUR));
}
ret.append(separator)
.append(printTwoDigits(cal.get(Calendar.MINUTE)))
.append(separator)
.append(cal.get(Calendar.SECOND))
.append(getAMPM(cal));
break;
case FORMAT_MONTH_DAY:
ret.append(cal.get(Calendar.MONTH)+1)
.append(separator)
.append(cal.get(Calendar.DAY_OF_MONTH));
break;
case FORMAT_DAY_MONTH:
ret.append(cal.get(Calendar.DAY_OF_MONTH))
.append(separator)
.append(cal.get(Calendar.MONTH)+1);
break;
case FORMAT_MONTH_DAY_YEAR:
ret.append(cal.get(Calendar.MONTH)+1)
.append(separator)
.append(cal.get(Calendar.DAY_OF_MONTH))
.append(separator)
.append(cal.get(Calendar.YEAR));
break;
case FORMAT_DAY_MONTH_YEAR:
ret.append(cal.get(Calendar.DAY_OF_MONTH))
.append(separator)
.append(cal.get(Calendar.MONTH)+1)
.append(separator)
.append(cal.get(Calendar.YEAR));
break;
default:
// Log.error("getFormattedStringFromDate: invalid format ("+
// format+")");
}
return ret.toString();
}
/**
* Returns a localized string representation of Date.
*/
public static String formatLocalTime(Date d) {
int dateFormat = FORMAT_MONTH_DAY_YEAR;
int timeFormat = FORMAT_HOURS_MINUTES;
if(!System.getProperty("microedition.locale").equals("en")) {
dateFormat = FORMAT_DAY_MONTH_YEAR;
}
return getFormattedStringFromDate(d,FORMAT_MONTH_DAY_YEAR,"/")
+" "+getFormattedStringFromDate(d,FORMAT_HOURS_MINUTES,":");
}
/**
* Parses the string in RFC 2822 format and return a Date
* object.
* Parse strings like:
* Thu, 03 May 2007 14:45:38 GMT
* Thu, 03 May 2007 14:45:38 GMT+0200
* Thu, 1 Feb 2007 03:57:01 -0800
* Fri, 04 May 2007 13:40:17 PDT
*
* @param d the date representation to parse
* @return a date, if valid, or null on error
*
*/
public static Date parseRfc2822Date(String stringDate) {
if (stringDate == null) {
return null;
}
long hourOffset=0;
long minOffset=0;
Calendar cal = Calendar.getInstance();
try {
// We use the ' ' as separator and we expect only one space. We
// clean the string to remove extra spaces
StringBuffer cleanedDate = new StringBuffer();
char previous = 'a';
for(int i=0;iDate
object from a string representing a date in
* 'Zulu' format (yyyyMMddTHHmmssZ)
*
* @param utc
* date in 'Zulu' format (yyyyMMddTHHmmssZ)
* @return A Date
object obtained starting from a time in
* milliseconds from the Epoch
*/
public static Date parseUTCDate(String utc) {
int day = 0;
int month = 0;
int year = 0;
int hour = 0;
int minute = 0;
int second = 0;
Calendar calendar = null;
day = Integer.parseInt(utc.substring(6, 8));
month = Integer.parseInt(utc.substring(4, 6));
year = Integer.parseInt(utc.substring(0, 4));
hour = Integer.parseInt(utc.substring(9, 11));
minute = Integer.parseInt(utc.substring(11, 13));
second = Integer.parseInt(utc.substring(13, 15));
calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, day);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
Date date = calendar.getTime();
long dateInMillis = date.getTime();
date.setTime(dateInMillis+millisDeviceOffset);
return date;
}
public static void setTimeZone(String timeZone){
if (timeZone == null || timeZone.length() < 5) {
// Log.error("setTimeZone: invalid timezone " + timeZone);
}
try {
deviceOffset = timeZone;
String hstmz = deviceOffset.substring(1, 3);
String mstmz = deviceOffset.substring(3, 5);
long hhtmz = Long.parseLong(hstmz);
long mmtmz = Long.parseLong(mstmz);
millisDeviceOffset = (hhtmz * 3600000) + (mmtmz * 60000);
if(deviceOffset.charAt(0)=='-') {
millisDeviceOffset *= -1;
}
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* returns a date with string representation of the month
* @param date input date in the format MM/DD/YYYY HH:MMp/a
* @return a representation of the date in the format