/* * Copyright 2014 Google Inc. All rights reserved. * * 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.google.samples.apps.iosched.util; import android.content.Context; import android.text.TextUtils; import android.text.format.DateUtils; import com.google.samples.apps.iosched.Config; import com.google.samples.apps.iosched.R; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class TimeUtils { private static final int SECOND = 1000; private static final int MINUTE = 60 * SECOND; private static final int HOUR = 60 * MINUTE; private static final int DAY = 24 * HOUR; public static String getTimeAgo(long time, Context ctx) { // TODO: use DateUtils methods instead if (time < 1000000000000L) { // if timestamp given in seconds, convert to millis time *= 1000; } long now = UIUtils.getCurrentTime(ctx); if (time > now || time <= 0) { return null; } final long diff = now - time; if (diff < MINUTE) { return "just now"; } else if (diff < 2 * MINUTE) { return "a minute ago"; } else if (diff < 50 * MINUTE) { return diff / MINUTE + " minutes ago"; } else if (diff < 90 * MINUTE) { return "an hour ago"; } else if (diff < 24 * HOUR) { return diff / HOUR + " hours ago"; } else if (diff < 48 * HOUR) { return "yesterday"; } else { return diff / DAY + " days ago"; } } private static final SimpleDateFormat[] ACCEPTED_TIMESTAMP_FORMATS = { new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US), new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy", Locale.US), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US), new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US), new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US), new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z", Locale.US) }; private static final SimpleDateFormat VALID_IFMODIFIEDSINCE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US); public static Date parseTimestamp(String timestamp) { for (SimpleDateFormat format : ACCEPTED_TIMESTAMP_FORMATS) { format.setTimeZone(TimeZone.getTimeZone("GMT")); try { return format.parse(timestamp); } catch (ParseException ex) { continue; } } // All attempts to parse have failed return null; } public static boolean isValidFormatForIfModifiedSinceHeader(String timestamp) { try { return VALID_IFMODIFIEDSINCE_FORMAT.parse(timestamp)!=null; } catch (Exception ex) { return false; } } public static long timestampToMillis(String timestamp, long defaultValue) { if (TextUtils.isEmpty(timestamp)) { return defaultValue; } Date d = parseTimestamp(timestamp); return d == null ? defaultValue : d.getTime(); } public static String formatShortDate(Context context, Date date) { StringBuilder sb = new StringBuilder(); Formatter formatter = new Formatter(sb); return DateUtils.formatDateRange(context, formatter, date.getTime(), date.getTime(), DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_NO_YEAR, PrefUtils.getDisplayTimeZone(context).getID()).toString(); } public static String formatShortTime(Context context, Date time) { DateFormat format = DateFormat.getTimeInstance(DateFormat.SHORT); TimeZone tz = PrefUtils.getDisplayTimeZone(context); if (tz != null) { format.setTimeZone(tz); } return format.format(time); } public static boolean hasConferenceStarted(final Context context) { long now = UIUtils.getCurrentTime(context); return now >= Config.CONFERENCE_START_MILLIS; } public static boolean hasConferenceEnded(final Context context) { long now = UIUtils.getCurrentTime(context); return now > Config.CONFERENCE_END_MILLIS; } public static boolean isConferenceInProgress(final Context context) { long now = UIUtils.getCurrentTime(context); return now >= Config.CONFERENCE_START_MILLIS && now <= Config.CONFERENCE_END_MILLIS; } /** * Returns "Today", "Tomorrow", "Yesterday", or a short date format. */ public static String formatHumanFriendlyShortDate(final Context context, long timestamp) { long localTimestamp, localTime; long now = UIUtils.getCurrentTime(context); TimeZone tz = PrefUtils.getDisplayTimeZone(context); localTimestamp = timestamp + tz.getOffset(timestamp); localTime = now + tz.getOffset(now); long dayOrd = localTimestamp / 86400000L; long nowOrd = localTime / 86400000L; if (dayOrd == nowOrd) { return context.getString(R.string.day_title_today); } else if (dayOrd == nowOrd - 1) { return context.getString(R.string.day_title_yesterday); } else if (dayOrd == nowOrd + 1) { return context.getString(R.string.day_title_tomorrow); } else { return formatShortDate(context, new Date(timestamp)); } } }