blob: d4636af05dc77d8e7a68908aaf1f2423c2a1d917 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2011 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.commons.core;
import java.util.Calendar;
import org.eclipse.core.runtime.Assert;
import org.eclipse.mylyn.internal.commons.core.Messages;
import org.eclipse.osgi.util.NLS;
/**
* Used for formatting dates.
*
* @author Mik Kersten
* @since 3.0
* @noinstantiate This class is not intended to be instantiated by clients.
*/
public class DateUtil {
public static String getIsoFormattedDate(Calendar calendar) {
try {
int monthInt = (calendar.get(Calendar.MONTH) + 1);
String month = "" + monthInt; //$NON-NLS-1$
if (monthInt < 10) {
month = "0" + month; //$NON-NLS-1$
}
int dateInt = (calendar.get(Calendar.DATE));
String date = "" + dateInt; //$NON-NLS-1$
if (dateInt < 10) {
date = "0" + date; //$NON-NLS-1$
}
return calendar.get(Calendar.YEAR) + "-" + month + "-" + date; //$NON-NLS-1$ //$NON-NLS-2$
} catch (Exception e) {
return "<unresolved date>"; //$NON-NLS-1$
}
}
/**
* @return Time formatted according to: http://www.iso.org/iso/date_and_time_format
*/
public static String getIsoFormattedDateTime(Calendar calendar) {
return getIsoFormattedDate(calendar) + "T" + calendar.get(Calendar.HOUR) + "-" + calendar.get(Calendar.MINUTE) //$NON-NLS-1$ //$NON-NLS-2$
+ "-" + calendar.get(Calendar.SECOND); //$NON-NLS-1$
}
/**
* Returns the time in the format: HHH:MM. If <code>includeSeconds</code> is true, the returned format is:
* HHH:MM:SS.
*
* @since 3.5
*/
public static String getFormattedDurationShort(long duration, boolean includeSeconds) {
if (duration <= 0) {
return "00:00"; //$NON-NLS-1$
}
long totalSeconds = duration / 1000;
long remainderSeconds = totalSeconds % 60;
long totalMinutes = totalSeconds / 60;
long remainderMinutes = totalMinutes % 60;
long totalHours = totalMinutes / 60;
StringBuffer sb = new StringBuffer(8);
if (totalHours < 10) {
sb.append("0"); //$NON-NLS-1$
}
sb.append(totalHours);
sb.append(":"); //$NON-NLS-1$
if (remainderMinutes < 10) {
sb.append("0"); //$NON-NLS-1$
}
sb.append(remainderMinutes);
if (includeSeconds) {
sb.append(":"); //$NON-NLS-1$
if (remainderSeconds < 10) {
sb.append("0"); //$NON-NLS-1$
}
sb.append(remainderSeconds);
}
return sb.toString();
}
/** Returns the time in the format: HHH:MM */
public static String getFormattedDurationShort(long duration) {
return getFormattedDurationShort(duration, false);
}
/**
* @deprecated The result of this method is not properly localized.
*/
@Deprecated
public static String getFormattedDuration(long duration, boolean includeSeconds) {
long seconds = duration / 1000;
long minutes = 0;
long hours = 0;
// final long SECOND = 1000;
final long MIN = 60;
final long HOUR = MIN * 60;
String formatted = ""; //$NON-NLS-1$
String hour = ""; //$NON-NLS-1$
String min = ""; //$NON-NLS-1$
String sec = ""; //$NON-NLS-1$
if (seconds >= HOUR) {
hours = seconds / HOUR;
if (hours == 1) {
hour = hours + " hour "; //$NON-NLS-1$
} else if (hours > 1) {
hour = hours + " hours "; //$NON-NLS-1$
}
seconds -= hours * HOUR;
minutes = seconds / MIN;
if (minutes == 1) {
min = minutes + " minute "; //$NON-NLS-1$
} else if (minutes != 1) {
min = minutes + " minutes "; //$NON-NLS-1$
}
seconds -= minutes * MIN;
if (seconds == 1) {
sec = seconds + " second"; //$NON-NLS-1$
} else if (seconds > 1) {
sec = seconds + " seconds"; //$NON-NLS-1$
}
formatted += hour + min;
if (includeSeconds) {
formatted += sec;
}
} else if (seconds >= MIN) {
minutes = seconds / MIN;
if (minutes == 1) {
min = minutes + " minute "; //$NON-NLS-1$
} else if (minutes != 1) {
min = minutes + " minutes "; //$NON-NLS-1$
}
seconds -= minutes * MIN;
if (seconds == 1) {
sec = seconds + " second"; //$NON-NLS-1$
} else if (seconds > 1) {
sec = seconds + " seconds"; //$NON-NLS-1$
}
formatted += min;
if (includeSeconds) {
formatted += sec;
}
} else {
if (seconds == 1) {
sec = seconds + " second"; //$NON-NLS-1$
} else if (seconds > 1) {
sec = seconds + " seconds"; //$NON-NLS-1$
}
if (includeSeconds) {
formatted += sec;
}
}
return formatted;
}
private static long MILLIS_SECOND = 1000;
private static long MILLIS_MINUTE = 60 * MILLIS_SECOND;
private static long MILLIS_HOUR = 60 * MILLIS_MINUTE;
private static long MILLIS_DAY = 24 * MILLIS_HOUR;
private static long MILLIS_WEEK = 7 * MILLIS_DAY;
private static long MILLIS_MONTH = 4 * MILLIS_WEEK;
private enum Period {
MONTH(MILLIS_MONTH, Messages.DateUtil_month_single, Messages.DateUtil_month_multi), //
WEEK(MILLIS_WEEK, Messages.DateUtil_week, Messages.DateUtil_weeks), //
DAY(MILLIS_DAY, Messages.DateUtil_day, Messages.DateUtil_days), //
HOUR(MILLIS_HOUR, Messages.DateUtil_hour, Messages.DateUtil_hours), //
MINUTE(MILLIS_MINUTE, Messages.DateUtil_minute, Messages.DateUtil_minutes), //
SECOND(MILLIS_SECOND, Messages.DateUtil_second, Messages.DateUtil_seconds);
private final long duration;
private final String singularLabel;
private final String pluralLabel;
Period(long duration, String singularLabel, String pluralLabel) {
this.duration = duration;
this.singularLabel = singularLabel;
this.pluralLabel = pluralLabel;
}
public String toString(long time) {
long count = time / duration;
if (count <= 1) {
return NLS.bind(singularLabel, count);
} else {
return NLS.bind(pluralLabel, count);
}
}
}
private static class PeriodString {
private final Period period;
private final long duration;
private PeriodString next;
public PeriodString(Period period, long duration) {
Assert.isNotNull(period);
this.period = period;
this.duration = duration;
}
public void append(PeriodString next) {
this.next = next;
}
@Override
public String toString() {
return period.toString(duration) + ((next != null) ? " " + next.toString() : ""); //$NON-NLS-1$ //$NON-NLS-2$
}
}
/**
* @since 3.5
*/
public static String getRelative(long time) {
long diff = System.currentTimeMillis() - time;
String duration = getRelativeDuration(Math.abs(diff));
if (duration.length() > 0) {
if (diff > 0) {
return NLS.bind(Messages.DateUtil_ago, duration);
} else {
return NLS.bind(Messages.DateUtil_in, duration);
}
}
return ""; //$NON-NLS-1$
}
/**
* @since 3.5
*/
public static String getRelativeDuration(long diff) {
PeriodString string = null;
for (Period period : Period.values()) {
boolean wasSet = (string != null);
if (diff >= period.duration) {
if (string == null) {
string = new PeriodString(period, diff);
} else {
string.append(new PeriodString(period, diff));
// do not add more than two segments
break;
}
diff -= (diff / period.duration) * period.duration;
}
// only return more than one segment if the second segment follows the first one directly
if (wasSet) {
break;
}
}
return (string != null) ? string.toString() : ""; //$NON-NLS-1$
}
}