DateJodaTimeUtils

package cn.net.zzfz.center.common.util;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;

public class DateJodaTimeUtils {

    public static final int WEEK_DAYS = 7;
    private static final String format_default = "yyyy-MM-dd HH:mm:ss";
    private static final String format_yMd = "yyyy-MM-dd";

    public static String getNowTime(String... format) {
        String fm = format_default;
        if (format != null && format.length > 0) {
            fm = format[0];
        }
        return new DateTime().toString(fm);
    }

    public static DateTime calendarToDateTime(Calendar c) {
        return new DateTime(c);
    }

    public static String calendarToString(Calendar c, String... format) {
        String pattern = format_default;
        if (isNotEmpty(format)) {
            pattern = format[0];
        }
        return calendarToDateTime(c).toString(pattern);
    }

    public static DateTime dateToDateTime(Date date) {
        return new DateTime(date);
    }

    public static String dateToString(Date date, String... format) {
        String pattern = format_default;
        if (isNotEmpty(format)) {
            pattern = format[0];
        }
        return dateToDateTime(date).toString(pattern);
    }

    public static DateTime stringToDateTime(String time) {
        return DateTime.parse(time, DateTimeFormat.forPattern(format_default));
    }

    public static Calendar stringToCalendar(String time) {
        return stringToDateTime(time).toCalendar(Locale.getDefault());
    }

    public static Calendar stringToCalendarYMD(String time) {
        return DateTime.parse(time, DateTimeFormat.forPattern(format_yMd))
                .toCalendar(Locale.getDefault());
    }

    /**
     * 二时间差值
     *
     * @param startCal  2014-12-26到2015-01-02  差值为6 (不包含2015-01-02)
     * @param endCal
     * @param key
     *            @see TimeType
     * @return
     */

    public static long compareCalendarByType(Calendar startCal,Calendar endCal, TimeType type) {
        if (type == null) {
            type = TimeType.day;
        }
        long diffNum = 0;
        DateTime begin = setDateTimeToStart(calendarToDateTime(startCal), type);
        DateTime end = setDateTimeToStart(calendarToDateTime(endCal), type);

        Duration duration = new Duration(begin, end);
        switch (type) {
        case day:
            diffNum = duration.getStandardDays();
            break;
        case hour:
            diffNum = duration.getStandardHours();
            break;
        case minute:
            diffNum = duration.getStandardMinutes();
            break;
        case second:
            diffNum = duration.getStandardSeconds();
            break;
        case millis:
            diffNum = duration.getMillis();
            break;
        default:
            diffNum = duration.getStandardSeconds();
            break;
        }
        return diffNum;
    }

    public static DateTime setDateTimeToStart(DateTime dateTime, TimeType key) {
        if (dateTime == null) {
            dateTime = DateTime.now();
        }

        switch (key) {
        case year:
            dateTime = dateTime.withMonthOfYear(1).withDayOfMonth(1)
                    .withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0);
            break;
        case month:
            dateTime = dateTime.withDayOfMonth(1).withHourOfDay(0)
                    .withMinuteOfHour(0).withSecondOfMinute(0);
            break;
        case day:
            dateTime = dateTime.withHourOfDay(0).withMinuteOfHour(0)
                    .withSecondOfMinute(0);
            break;
        case hour:
            dateTime = dateTime.withMinuteOfHour(0).withSecondOfMinute(0);
            break;
        case minute:
            dateTime = dateTime.withSecondOfMinute(0);
            break;
        case second:
            dateTime = dateTime.withMillisOfSecond(0);
            break;
        default:// TimeType.day
            dateTime = dateTime.withHourOfDay(0).withMinuteOfHour(0)
                    .withSecondOfMinute(0);
            break;
        }
        return dateTime;
    }

    /**
     * 加时间
     *
     * @param num
     * @param key
     *            y M w d h m s
     * @param c
     * @return
     */
    public static Calendar plusNumToCalendar(int num, TimeType key,
            Calendar... c) {
        Calendar calendar = null;
        if (isNotEmpty(c)) {
            calendar = c[0];
        } else {
            calendar = Calendar.getInstance();
        }
        return plusNumToDateTime(num, key, calendarToDateTime(calendar))
                .toCalendar(Locale.getDefault());
    }

    public static DateTime plusNumToDateTime(int num, TimeType key, DateTime... dt) {
        DateTime dateTime = DateTime.now();
        if (isNotEmpty(dt)) {
            dateTime = dt[0];
        }
        switch (key) {
        case year:
            dateTime = dateTime.plusYears(num);
            break;
        case month:
            dateTime = dateTime.plusMonths(num);
            break;
        case week:
            dateTime = dateTime.plusWeeks(num);
            break;
        case day:
            dateTime = dateTime.plusDays(num);
            break;
        case hour:
            dateTime = dateTime.plusHours(num);
            break;
        case minute:
            dateTime = dateTime.plusMinutes(num);
            break;
        case second:
            dateTime = dateTime.plusSeconds(num);
            break;
        default :
            dateTime = dateTime.plusHours(num);
            break;
        }
        return dateTime;
    }
    
    /**
     * 返回00:00:00
     *
     * @param c
     * @return
     */
    public static Calendar getCalendarMorning(Calendar c) {
        return getDateTimeMorning(c).toCalendar(Locale.getDefault());
    }

    public static DateTime getDateTimeMorning(Calendar c) {
        DateTime dateTime = calendarToDateTime(c);
        dateTime = dateTime.withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0);
        return dateTime;
    }
    
    /**
     * 返回23:59:59
     *
     * @param c
     * @return
     */
    public static Calendar getCalendarMidnight(Calendar c) {
        return getDateTimeMidnight(c).toCalendar(Locale.getDefault());
    }

    public static DateTime getDateTimeMidnight(Calendar c) {
        DateTime dateTime = calendarToDateTime(c);
        dateTime = dateTime.withHourOfDay(23).withMinuteOfHour(59)
                .withSecondOfMinute(59);
        return dateTime;
    }

    /**
     * 一周中的第几天。周一:1 周二:2 ...
     *
     * @param c
     * @return
     */
    public static int getDayInWeek(Calendar c) {
        if(c == null){
            c = Calendar.getInstance();
        }
        return new DateTime(c).getDayOfWeek();
    }

    /**
     * 时间段内 日期列表
     *
     * @param c1
     * @param c2
     * @param format
     * @return
     */
    public static List<String> getDayBetweenStr(Calendar c1, Calendar c2, String... format) {
        List<String> list = new ArrayList<String>(15);
        String pattern = format_yMd;
        if (isNotEmpty(format)) {
            pattern = format[0];
        }
        long days = compareCalendarByType(c1, c2, TimeType.day);
        DateTime start = calendarToDateTime(c1);
        for (int i = 0; i <= days; i++) {
            list.add(plusNumToDateTime(i, TimeType.day, start).toString(pattern));
        }
        return list;
    }

    /**
     * 日期在年中第几周
     *
     * @param c
     * @return
     */
    public static int getWeekInYear(Calendar c) {
        if (c == null) {
            c  = Calendar.getInstance();
        }
        return new DateTime(c).getWeekOfWeekyear();
    }

    public static int getWeekOfYMD(int year, int monthOfYear, int dayOfMonth) {
        LocalDate date = new LocalDate(year, monthOfYear, dayOfMonth);
        return date.weekOfWeekyear().get();
    }

    /**
     * 某年某周第一天
     *
     * @param year
     * @param weekOfWeekyear
     * @return
     */
    public static DateTime getFirstDayOfYearWeek(int year, int weekOfWeekyear) {
        DateTime dateTime = DateTime.now();
        dateTime = dateTime.withYear(year).withWeekOfWeekyear(weekOfWeekyear).dayOfWeek().withMinimumValue();
        return dateTime;
    }

    public static DateTime getLastDayOfYearWeek(int year, int weekOfWeekyear) {
        return DateTime.now().withYear(year).withWeekOfWeekyear(weekOfWeekyear)
                .dayOfWeek().withMaximumValue();
    }

    public static DateTime getFirstDayInNowWeek() {
        return DateTime.now().dayOfWeek().withMinimumValue();
    }

    public static DateTime getLastDayInNowWeek() {
        return DateTime.now().dayOfWeek().withMaximumValue();
    }

    public static DateTime getLastDayOfYearMonth(int year, int monthOfYear) {
        return DateTime.now().withYear(year).withMonthOfYear(monthOfYear)
                .dayOfMonth().withMaximumValue();
    }

    public static DateTime getLastDayOfNowMonth() {
        return DateTime.now().dayOfMonth().withMaximumValue();
    }

    /**
     * 某周的七天日期 
     *
     * @param year
     * @param week
     * @return
     */
    public static Map<String, String> getDateOfWeekMap(String... format) {
        DateTime dateTime = DateTime.now();
        return getDateOfWeekMap(dateTime.getYear(),
                dateTime.getWeekOfWeekyear(), format);
    }

    public static Map<String, String> getDateOfWeekMap(int year, int week,
            String... format) {
        String pattern = format_yMd;
        if (isNotEmpty(format)) {
            pattern = format[0];
        }
        Map<String, String> map = new LinkedHashMap<String, String>();
        DateTime dateTime = DateTime.now().withYear(year)
                .withWeekOfWeekyear(week).dayOfWeek().withMinimumValue();
        for (int i = 0; i < WEEK_DAYS; i++) {
            map.put((i + 1) + "", dateTime.plusDays(i).toString(pattern));
        }
        return map;
    }

    public static Map<String, String> getWeekAssertDateMap(String... format) {
        return getWeekAssertDateMap(2, true, format);
    }

    public static Map<String, String> getWeekAssertDateMap(int type,
            String... format) {
        return getWeekAssertDateMap(type, true, format);
    }

    /**
     * 今日起一周内对应日期
     *
     * @param type
     *             1:数字(1-7) 2:周几 default:星期几
     * @param isChangeWeekToDate
     *            默认true{key:type,value:日期}; false:{key:日期,value:type}
     * @param format
     * @return
     */
    public static Map<String, String> getWeekAssertDateMap(int type,
            boolean isChangeWeekToDate, String... format) {
        Map<String, String> map = new LinkedHashMap<String, String>();
        String pattern = "yyMMdd";
        if (isNotEmpty(format)) {
            pattern = format[0];
        }
        String[] weekArr = new String[] {};
        switch (type) {
        case 1:
            weekArr = new String[] { "1", "2", "3", "4", "5", "6", "7" };
            break;
        case 2:
            weekArr = new String[] { "周一", "周二", "周三", "周四", "周五", "周六", "周日" };
            break;
        default:
            weekArr = new String[] { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六",
                    "星期日" };
            break;
        }
        DateTime dateTime = DateTime.now();
        for (int i = 0; i < weekArr.length; i++) {
            int day = dateTime.getDayOfWeek();
            if (isChangeWeekToDate) {
                map.put(weekArr[day - 1], dateTime.toString(pattern));
            } else {
                map.put(dateTime.toString(pattern), weekArr[day - 1]);
            }
            dateTime = dateTime.plusDays(1);
        }
        return map;
    }
    
    public static String getDayOfWeek(Calendar c) {
        return new String[] {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }[c.get(Calendar.DAY_OF_WEEK)-1];
    }

    public static <T> boolean isNotEmpty(@SuppressWarnings("unchecked") T... obj) {
        if (obj != null && obj.length > 0 && obj[0] != null) {
            if (obj[0] instanceof String) {
                if (StringUtils.isBlank(obj[0].toString())) {
                    return false;
                }
            }
            return true;
        }
        return false;
    }
    
    /**
     * 不支持超过24小时。排序 升序<br/>
     * 半小时统计  key未数为0、5;  0表示上半小时,5表示下半小时 <br/>
     * eg:
     * 110  -->yyyy-MM-dd 11:00:00-yyyy-MM-dd 11:29:59  <br/>
     * 115  -->yyyy-MM-dd 11:30:00-yyyy-MM-dd 11:59:59
     * @param startCal
     * @param endCal
     * @return null startCal大于endCal
     */
    public static Map<Integer, List<Calendar>> getTotalHalfHour(Calendar startCal, Calendar endCal){
        DateTime dt1 = calendarToDateTime(startCal);
        DateTime dt2 = calendarToDateTime(endCal);
        Map<Integer, List<Calendar>> map = new HashMap<Integer, List<Calendar>>();
        
        long minute = compareCalendarByType(startCal, endCal, TimeType.minute);
        long half = minute%30==0?minute/30:(minute/30 + 1);        
        Calendar begin ,end;        

        if(dt1.getMinuteOfHour() < 30 && dt2.getMinuteOfHour() >= 30){
            List<Calendar> calList = new ArrayList<Calendar>();
            begin = dt2.withHourOfDay(dt2.getHourOfDay()).withMinuteOfHour(30).withSecondOfMinute(0).toCalendar(Locale.getDefault());
            end = dt2.withHourOfDay(dt2.getHourOfDay()).withMinuteOfHour(59).withSecondOfMinute(59).toCalendar(Locale.getDefault());
            calList.add(begin);
            calList.add(end);
            map.put(Integer.parseInt(dt2.getHourOfDay()+"5"), calList);    
        }
        
        for (int i = 0; i < half; i++) {
            List<Calendar> calList = new ArrayList<Calendar>();
            if(dt1.isAfter(dt2.getMillis()) && dt2.getMinuteOfHour() < 30){
                continue;
            }    
            Integer key = 0;
            if(dt1.getMinuteOfHour()<30){
                key = Integer.parseInt(dt1.getHourOfDay()+"0");
                begin = dt1.withHourOfDay(dt1.getHourOfDay()).withMinuteOfHour(0).withSecondOfMinute(0).toCalendar(Locale.getDefault());
                end = dt1.withHourOfDay(dt1.getHourOfDay()).withMinuteOfHour(29).withSecondOfMinute(59).toCalendar(Locale.getDefault());
            }else{
                key = Integer.parseInt(dt1.getHourOfDay()+"5");
                begin = dt1.withHourOfDay(dt1.getHourOfDay()).withMinuteOfHour(30).withSecondOfMinute(0).toCalendar(Locale.getDefault());
                end = dt1.withHourOfDay(dt1.getHourOfDay()).withMinuteOfHour(59).withSecondOfMinute(59).toCalendar(Locale.getDefault());
            }
            calList.add(begin);
            calList.add(end);
            map.put(key, calList);    
            dt1 = dt1.plusMinutes(30);            
        }
        
        Map<Integer, List<Calendar>> sortMap = new TreeMap<Integer, List<Calendar>>();  
        sortMap.putAll(map);              
        return sortMap;
    }
    
    public static void main(String[] args) {
        
        DateTime dt = new DateTime();
        dt = dt.withYear(2015).withMonthOfYear(1).withDayOfMonth(2).withHourOfDay(20);
        System.out.println(dt.toString());
        System.out.println(DateJodaTimeUtils.compareCalendarByType(Calendar.getInstance(), dt.toCalendar(Locale.CHINA), TimeType.day));
        
        DateTime a = new DateTime();
//        a = a.plusDays(7);
        System.out.println(a.toString());
        System.out.println(DateJodaTimeUtils.compareCalendarByType(a.toCalendar(Locale.CHINA), Calendar.getInstance(), TimeType.day));
        
        System.out.println("============");
        DateTime b = new DateTime();
        b = b.withYear(2014).withMonthOfYear(12).withDayOfMonth(27).withHourOfDay(20);
        System.out.println(DateJodaTimeUtils.compareCalendarByType(Calendar.getInstance(), b.toCalendar(Locale.CHINA), TimeType.day));
        
        b = b.withYear(2014).withMonthOfYear(12).withDayOfMonth(28).withHourOfDay(20);
        System.out.println(DateJodaTimeUtils.compareCalendarByType(Calendar.getInstance(), b.toCalendar(Locale.CHINA), TimeType.day));
        
        b = b.withYear(2014).withMonthOfYear(12).withDayOfMonth(31).withHourOfDay(20);
        System.out.println(DateJodaTimeUtils.compareCalendarByType(Calendar.getInstance(), b.toCalendar(Locale.CHINA), TimeType.day));
        
        System.out.println("-------------");
        dt = dt.withYear(2015).withMonthOfYear(1).withDayOfMonth(1).withHourOfDay(20);
        System.out.println(dt.toString());
        System.out.println(DateJodaTimeUtils.compareCalendarByType(Calendar.getInstance(), dt.toCalendar(Locale.CHINA), TimeType.day));
        
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值