/******************************************************************************* * 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$ } }