/* * Copyright 2011 Adi Sayoga. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.adisayoga.earthquake.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import android.content.Context; import android.content.res.Resources; import android.util.Log; import com.adisayoga.earthquake.R; /** * Utility untuk memformat waktu. * * @author Adi Sayoga */ public class TimeUtils { private static final String TAG = "TimeUtils"; private static final int ZONE_OFFSET = Calendar.getInstance().get(Calendar.ZONE_OFFSET); private static final int DST_OFFSET = Calendar.getInstance().get(Calendar.DST_OFFSET); private static final long ONE_SECOND = 1000; private static final long ONE_MINUTE = ONE_SECOND * 60; private static final long ONE_HOUR = ONE_MINUTE * 60; private static final long ONE_DAY = ONE_HOUR * 24; private static final long ONE_MONTH = ONE_DAY * 30; private static final long ONE_YEAR = ONE_DAY * 365; private static TimeUtils instance = null; private static String justNow; private static String minuteAgo; private static String minutesAgo; private static String hourAgo; private static String hoursAgo; private static String yesterday; private static String daysAgo; private static String monthAgo; private static String monthsAgo; private static String timeFormat; private static String timeDayFormat; private static String dateShortFormat; private static String datetimeFormat; private static String datetimeYearFormat; private TimeUtils() { } public static final TimeUtils getInstance(Context context) { if (instance == null) { instance = new TimeUtils(); Resources resources = context.getResources(); justNow = resources.getString(R.string.tpl_just_now); minuteAgo = resources.getString(R.string.tpl_minute_ago); minutesAgo = resources.getString(R.string.tpl_minutes_ago); hourAgo = resources.getString(R.string.tpl_hour_ago); hoursAgo = resources.getString(R.string.tpl_hours_ago); yesterday = resources.getString(R.string.tpl_yesterday); daysAgo = resources.getString(R.string.tpl_days_ago); monthAgo = resources.getString(R.string.tpl_month_ago); monthsAgo = resources.getString(R.string.tpl_months_ago); timeFormat = resources.getString(R.string.format_time); timeDayFormat = resources.getString(R.string.format_time_day); datetimeFormat = resources.getString(R.string.format_datetime); dateShortFormat = resources.getString(R.string.format_date_short); datetimeYearFormat = resources.getString(R.string.format_datetime_year); } return instance; } /** * Konversi waktu (dalam milisecond) ke dalam format yang mudah dibaca * manusia. * <pre> * contoh: * * Baru saja * * 2 menit lalu, 10:00 AM * * 5 jam lalu, 10:00 AM * * Kemarin, 10:00 AM * * 3 hari lalu: Rabu, 10:00 AM * * 4 bulan lalu: Rabu, 22-Apr 10:00 AM * * Rabu, 22-Apr-2011 10:00 AM * </pre> * * @param time Waktu (dalam timestamp) yang diformat * @return Format string yang mudah dibaca manusia * * @see {@link #toHumanReadableShort(long)} */ public String toHumanReadable(long time) { long duration = System.currentTimeMillis() - time; if (duration < ONE_MINUTE) return justNow; SimpleDateFormat sdf; String dateString = ""; if (duration < ONE_HOUR) { sdf = new SimpleDateFormat(timeFormat); long minutes = duration / ONE_MINUTE; dateString = String.format((minutes <= 1) ? minuteAgo : minutesAgo, minutes) + ", "; } else if (duration < ONE_DAY) { sdf = new SimpleDateFormat(timeFormat); long hours = duration / ONE_HOUR; dateString = String.format((hours <= 1) ? hourAgo : hoursAgo, hours) + ", "; } else if (duration < ONE_MONTH) { long days = duration / ONE_DAY; if (days <= 1) { sdf = new SimpleDateFormat(timeFormat); dateString = yesterday + " "; } else if (days <= 3) { sdf = new SimpleDateFormat(timeDayFormat); dateString = String.format(daysAgo, days) + ", "; } else { sdf = new SimpleDateFormat(datetimeFormat); dateString = String.format(daysAgo, days) + ", "; } } else if (duration < ONE_YEAR) { sdf = new SimpleDateFormat(datetimeFormat); long months = duration / ONE_MONTH; if (months <= 1) { dateString = monthAgo + ", "; } else { dateString = String.format(monthsAgo, months) + ", "; } } else { sdf = new SimpleDateFormat(datetimeYearFormat); } dateString += sdf.format(new Date(time)); return dateString; } /** * Konversi waktu ke dalam format yang biasa dibaca manusia (singkat) * * @param time Waktu (dalam timestamp) yang diformat * @return Format string yang mudah dibaca manusia * * @see {@link #toHumanReadable(long)} */ public String toHumanReadableShort(long time) { long duration = System.currentTimeMillis() - time; if (duration < ONE_MINUTE) return justNow; SimpleDateFormat sdf; Date date = new Date(time); String dateString = ""; if (duration < ONE_DAY) { sdf = new SimpleDateFormat(timeFormat); dateString = sdf.format(date); } else if (duration < ONE_DAY * 2) { dateString = yesterday; } else { sdf = new SimpleDateFormat(dateShortFormat); dateString = sdf.format(date); } return dateString; } /** * Parse string ke dalam date. * * @param value Nilai dalam string * @param format Format * * @return Date * @throws ParseException */ public static Date parseDate(String value, SimpleDateFormat format) throws ParseException { try { Date date = format.parse(value); date = new Date(date.getTime() + ZONE_OFFSET + DST_OFFSET); return date; } catch (ParseException e) { Log.e(TAG, "Tidak dapat mem-parse tanggal dari string: " + value); throw e; } } }