// Created by plusminus on 10:12:09 - 04.02.2009
package org.androad.util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.StringTokenizer;
import java.util.TimeZone;
import org.androad.R;
import org.androad.util.constants.TimeConstants;
import android.content.Context;
public class TimeUtils implements TimeConstants {
// ===========================================================
// Constants
// ===========================================================
public static final SimpleDateFormat UTCSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
static{ // TODO Added 'static'... still working?
UTCSimpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
}
public static final DateFormat mSimpleDateFormat = DateFormat.getDateTimeInstance();
// ===========================================================
// Fields
// ===========================================================
// ===========================================================
// Constructors
// ===========================================================
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
/**
* @param pAdditionalMinutes
* @return If pAdditionalMinutes is 5 it will return 0:05.
*/
public static String getTimeDurationString(final int pAdditionalMinutes) {
final StringBuilder sb = new StringBuilder();
if(pAdditionalMinutes < MINUTESPERHOUR * 10){ /* < 10 hours */
sb.append(pAdditionalMinutes / MINUTESPERHOUR).append(':');
final int mins = pAdditionalMinutes % MINUTESPERHOUR;
if(mins < 10) {
sb.append('0');
}
sb.append(mins);
}else{ /* >= 10 hours */
sb.append(pAdditionalMinutes / MINUTESPERHOUR).append("h");
}
final String timeString = sb.toString();
return timeString;
}
public static final boolean isAMFromNow(final int pAdditionalMinutes){
final GregorianCalendar g = new GregorianCalendar();
g.add(Calendar.MINUTE, pAdditionalMinutes);
return g.get(Calendar.AM_PM) == Calendar.AM;
}
/**
* @param pAdditionalMinutes
* @return If it is 22:00 and the pAdditionalMinutes is 5 it will return 22:05.
*/
public static String getTimeString(final int pAdditionalMinutes){
final StringBuilder sb = new StringBuilder();
final GregorianCalendar g = new GregorianCalendar();
g.add(Calendar.MINUTE, pAdditionalMinutes);
final int hourOfArrival = g.get(Calendar.HOUR_OF_DAY);
final int minuteOfArrival = g.get(Calendar.MINUTE);
sb.append(hourOfArrival).append(':');
if(minuteOfArrival < 10) {
sb.append('0');
}
sb.append(minuteOfArrival);
return sb.toString();
}
public static final String convertTimestampToTimeString(final long aTimestamp) {
return mSimpleDateFormat.format(new Date(aTimestamp));
}
public static final String convertTimestampToUTCString(final long aTimestamp) {
return UTCSimpleDateFormat.format(new Date(aTimestamp));
}
public static final long convertUTCStringToTimestamp(final String aTimeString) throws ParseException {
return UTCSimpleDateFormat.parse(aTimeString).getTime();
}
/**
*
* @see http://www.w3schools.com/Schema/schema_dtypes_date.asp
* @param aDurationString
* @return duration in seconds.
*/
public static int durationTimeString(final String aDurationString){
boolean inTimeSegment = false;
int out = 0;
final StringTokenizer st = new StringTokenizer(aDurationString, "PYMDTHS", true);
final String[] tokens = new String[st.countTokens()];
int i = 0;
while(st.hasMoreTokens()) {
tokens[i++] = st.nextToken();
}
for (int j = 0; j < tokens.length; j++) {
final String cur = tokens[j];
final char charAtZero = cur.charAt(0);
switch(charAtZero){
case 'T':
inTimeSegment = true;
case 'P':
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
continue;
}
/* Now we can be sure that that the previous token is a number. */
final int val = Integer.parseInt(tokens[j-1]);
switch(charAtZero){
case 'Y':
out += val * SECONDSPERYEAR;
break;
case 'M':
if(inTimeSegment) {
out += val * SECONDSPERMINUTE;
} else {
out += val * SECONDSPERMONTH;
}
break;
case 'D':
out += val * SECONDSPERDAY;
break;
case 'H':
out += val * SECONDSPERHOUR;
break;
case 'S':
out += val;
break;
default:
throw new IllegalArgumentException("Illegal Token('" + cur + "') at position: " + i + " (Origin: '" + aDurationString + "')");
}
}
return out;
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
public static class DurationFormatter{
final String FORMAT = "hh:mm:ss";
final char MAXVALUE = 'd';
private final String[] YEAR;
private final String[] MONTH;
private final String[] WEEK;
private final String[] DAY;
private final String[] HOUR;
private final String[] MINUTE;
private final String[] SECOND;
public DurationFormatter(final Context ctx) {
this.YEAR = new String[]{ctx.getString(R.string.year), ctx.getString(R.string.years)};
this.MONTH = new String[]{ctx.getString(R.string.month), ctx.getString(R.string.months)};
this.WEEK = new String[]{ctx.getString(R.string.week), ctx.getString(R.string.weeks)};
this.DAY = new String[]{ctx.getString(R.string.day), ctx.getString(R.string.days)};
this.HOUR = new String[]{ctx.getString(R.string.hour), ctx.getString(R.string.hours)};
this.MINUTE = new String[]{ctx.getString(R.string.minute), ctx.getString(R.string.minutes)};
this.SECOND = new String[]{ctx.getString(R.string.second), ctx.getString(R.string.seconds)};
}
public String format(final long pSeconds){
final StringBuilder sb = new StringBuilder();
long restSeconds = pSeconds;
final int years;
final int months;
final int weeks;
final int days;
final int hours;
final int minutes;
final int seconds;
/* Years */
if(restSeconds >= SECONDSPERYEAR){
years = (int)(restSeconds / SECONDSPERYEAR);
restSeconds = restSeconds % SECONDSPERYEAR;
}else{
years = 0;
}
/* Months */
if(restSeconds >= SECONDSPERMONTH){
months = (int)(restSeconds / SECONDSPERMONTH);
restSeconds = restSeconds % SECONDSPERMONTH;
}else{
months = 0;
}
/* Weeks */
if(restSeconds >= SECONDSPERWEEK){
weeks = (int)(restSeconds / SECONDSPERWEEK);
restSeconds = restSeconds % SECONDSPERWEEK;
}else{
weeks = 0;
}
/* Days */
if(restSeconds >= SECONDSPERDAY){
days = (int)(restSeconds / SECONDSPERDAY);
restSeconds = restSeconds % SECONDSPERDAY;
}else{
days = 0;
}
/* Hours */
if(restSeconds >= SECONDSPERHOUR){
hours = (int)(restSeconds / SECONDSPERHOUR);
restSeconds = restSeconds % SECONDSPERHOUR;
}else{
hours = 0;
}
/* Minutes */
if(restSeconds >= SECONDSPERMINUTE){
minutes = (int)(restSeconds / SECONDSPERMINUTE);
restSeconds = restSeconds % SECONDSPERMINUTE;
}else{
minutes = 0;
}
seconds = (int)restSeconds;
if(years > 0){
sb.append(years)
.append(' ')
.append(getSingularOrPlural(years, this.YEAR));
}
if(months > 0){
sb.append(' ')
.append(months)
.append(' ')
.append(getSingularOrPlural(months, this.MONTH));
}
if(weeks > 0){
sb.append(' ')
.append(weeks)
.append(' ')
.append(getSingularOrPlural(weeks, this.WEEK));
}
if(days > 0){
sb.append(' ')
.append(days)
.append(' ')
.append(getSingularOrPlural(days, this.DAY));
}
if(hours > 0){
sb.append(' ')
.append(hours)
.append(' ')
.append(getSingularOrPlural(hours, this.HOUR));
}
if(minutes > 0){
sb.append(' ')
.append(minutes)
.append(' ')
.append(getSingularOrPlural(minutes, this.MINUTE));
}
if(seconds > 0){
sb.append(' ')
.append(seconds)
.append(' ')
.append(getSingularOrPlural(seconds, this.SECOND));
}
return sb.toString().trim();
}
private String getSingularOrPlural(final int pYears, final String[] pArr) {
if(pYears == 1) {
return pArr[0];
} else {
return pArr[1];
}
}
}
}