io.github.sparta.helpers.date.DateUtil.java Source code

Java tutorial

Introduction

Here is the source code for io.github.sparta.helpers.date.DateUtil.java

Source

/*
 * Copyright  2012-2013 mumu@yfyang. 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 io.github.sparta.helpers.date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;

import org.apache.commons.lang3.StringUtils;

/**
 * Date Utility.
 * 
 * @author JunHo Yoon
 * @since 3.0
 */
public abstract class DateUtil {

    private static final int CONSTANT_10 = 10;
    private static final int CONSTANT_24 = 24;
    private static final int CONSTANT_60 = 60;
    private static final int CONSTANT_1000 = 1000;
    // private static final int CONSTANT_MINUS_7 = -7;
    private static final int SS = CONSTANT_1000;
    private static final int MI = SS * CONSTANT_60;
    private static final int HH = MI * CONSTANT_60;
    private static final int DD = HH * CONSTANT_24;

    private static Map<String, String> timezoneIDMap;

    /**
     * get the time in long format : "yyyyMMddHHmmss".
     * 
     * @param date
     *            date to be format
     * @return time time in format of long type
     */
    public static long getCollectTimeInLong(Date date) {
        SimpleDateFormat collectTimeFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        return Long.valueOf(collectTimeFormat.format(date));
    }

    /**
     * convert user date to new date with server side Locale.
     * 
     * @param userTimeZone
     *            user TimeZone id
     * @param userDate
     *            date in user's Local
     * @return serverDate data in server's Local
     */
    public static Date convertToServerDate(String userTimeZone, Date userDate) {
        TimeZone userLocal = TimeZone.getTimeZone(userTimeZone);
        int rawOffset = TimeZone.getDefault().getRawOffset() - userLocal.getRawOffset();
        return new Date(userDate.getTime() + rawOffset);
    }

    /**
     * convert server date to new date with user Locale.
     * 
     * @param userTimeZone
     *            user TimeZone id
     * @param serverDate
     *            date in server's Local
     * @return serverDate data in user's Local
     */
    public static Date convertToUserDate(String userTimeZone, Date serverDate) {
        TimeZone userLocal = TimeZone.getTimeZone(userTimeZone);
        int rawOffset = userLocal.getRawOffset() - TimeZone.getDefault().getRawOffset();
        return new Date(serverDate.getTime() + rawOffset);
    }

    /**
     * Format date to {@value #FULL_DATE_FORMAT}.
     * 
     * @param date
     *            date
     * @return formated string
     */
    public static String dateToString(Date date) {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(date);
    }

    /**
     * Get time zones.
     * 
     * @return map typezone id and GMT
     */
    public static Map<String, String> getFilteredTimeZoneMap() {
        if (timezoneIDMap == null) {
            timezoneIDMap = new LinkedHashMap<String, String>();
            String[] ids = TimeZone.getAvailableIDs();
            for (String id : ids) {
                TimeZone zone = TimeZone.getTimeZone(id);
                int offset = zone.getRawOffset();
                int offsetSecond = offset / CONSTANT_1000;
                int hour = offsetSecond / (CONSTANT_60 * CONSTANT_60);
                int minutes = (offsetSecond % (CONSTANT_60 * CONSTANT_60)) / CONSTANT_60;
                timezoneIDMap.put(TimeZone.getTimeZone(id).getDisplayName(),
                        String.format("(GMT%+d:%02d) %s", hour, minutes, id));
            }
        }
        return timezoneIDMap;
    }

    /**
     * Convert string date to Date with {@value #SIMPLE_DATE_FORMAT}.
     * 
     * @param strDate
     *            date string
     * @return date
     * @throws java.text.ParseException
     *             occurs when given steDate is not {@link #SIMPLE_DATE_FORMAT}
     */
    public static Date toSimpleDate(String strDate) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
        return simpleDateFormat.parse(strDate);
    }

    /**
     * Convert string date to Date with {@value #FULL_DATE_FORMAT}.
     * 
     * @param strDate
     *            date string
     * @return date
     * 
     * @throws java.text.ParseException
     *             occurs when given steDate is not {@link #FULL_DATE_FORMAT}
     */
    public static Date toDate(String strDate) throws ParseException {
        SimpleDateFormat fullDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        return fullDateFormat.parse(strDate);
    }

    /**
     * Add days on date.
     * 
     * @param date
     *            base date
     * @param days
     *            days to be added.
     * @return added Date
     */
    public static Date addDay(Date date, int days) {
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_YEAR, days);
        return cal.getTime();
    }

    /**
     * Convert millisecond to DD:HH:MM:SS style.
     * 
     * @param ms
     *            Millisecond
     * @return DD:HH:MM:SS formated string
     */
    public static String ms2Time(long ms) {
        long day = ms / DD;
        long hour = (ms - day * DD) / HH;
        long minute = (ms - day * DD - hour * HH) / MI;
        long second = (ms - day * DD - hour * HH - minute * MI) / SS;

        String strDay = day < CONSTANT_10 ? "0" + day : "" + day;
        String strHour = hour < CONSTANT_10 ? "0" + hour : "" + hour;
        String strMinute = minute < CONSTANT_10 ? "0" + minute : "" + minute;
        String strSecond = second < CONSTANT_10 ? "0" + second : "" + second;
        strDay = (StringUtils.equals(strDay, "00")) ? "" : strDay + ":";
        return strDay + strHour + ":" + strMinute + ":" + strSecond;
    }

    /**
     * Convert time to millisecond.
     * 
     * @param day
     *            day
     * @param hour
     *            hour
     * @param min
     *            min
     * @param sec
     *            sec
     * @return converted millisecond
     */
    public static long timeToMs(int day, int hour, int min, int sec) {
        return ((long) CONSTANT_1000) * (((day * CONSTANT_24 + hour) * CONSTANT_60 + min) * CONSTANT_60 + sec);
    }

    /**
     * Compare two date in minute detail.
     * 
     * @param d1
     *            date
     * @param d2
     *            date
     * @return true if two {@link java.util.Date} are same in minute level
     */
    public static boolean compareDateEndWithMinute(Date d1, Date d2) {
        SimpleDateFormat dateFormatEndWithMinute = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        String s1 = dateFormatEndWithMinute.format(d1);
        String s2 = dateFormatEndWithMinute.format(d2);
        return (s1.equals(s2));
    }

}