DateHelper.java 27.9 KB
Newer Older
yanzg's avatar
yanzg committed
1 2
package com.yanzuoguang.util.helper;

yanzg's avatar
yanzg committed
3
import com.yanzuoguang.util.exception.ExceptionHelper;
yanzg's avatar
yanzg committed
4 5 6 7 8 9 10 11 12 13

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * 日期工具类
yanzg's avatar
yanzg committed
14
 *
yanzg's avatar
yanzg committed
15
 * @author 颜佐光
yanzg's avatar
yanzg committed
16 17 18
 */
public class DateHelper {

yanzg's avatar
yanzg committed
19 20 21 22
    public static final String FORMAT_YEAR_STRING = "yyyy-01-01";
    public static final String FORMAT_YEAR_END_STRING = "yyyy-12-31";
    public static final String FORMAT_MONTH_STRING = "yyyy-MM-01";
    public static final String FORMAT_DAY_STRING = "yyyy-MM-dd";
yanzg's avatar
yanzg committed
23
    public static final String FORMAT_TIME_STRING = "HH:mm:ss";
yanzg's avatar
yanzg committed
24
    public static final String INIT_TIME = "00:00:00";
yanzg's avatar
yanzg committed
25 26
    public static final String FORMAT_DAY_HOUR_STRING = "yyyy-MM-dd HH:00:00";
    public static final String FORMAT_SECOND_STRING = "yyyy-MM-dd HH:mm:ss";
yanzg's avatar
yanzg committed
27

yanzg's avatar
yanzg committed
28 29 30 31 32 33 34 35 36 37 38 39
    private static final int MONTH_1 = 1;
    private static final int MONTH_2 = 2;
    private static final int MONTH_3 = 3;
    private static final int MONTH_4 = 4;
    private static final int MONTH_5 = 5;
    private static final int MONTH_6 = 6;
    private static final int MONTH_7 = 7;
    private static final int MONTH_8 = 8;
    private static final int MONTH_9 = 9;
    private static final int MONTH_10 = 10;
    private static final int MONTH_11 = 11;
    private static final int MONTH_12 = 12;
yanzg's avatar
yanzg committed
40

yanzg's avatar
yanzg committed
41 42 43 44 45 46 47 48 49 50
    /**
     * 判断时间是否是初始化时间
     *
     * @param time 历史初始化日期
     * @return 新的日期
     */
    public static final boolean isInitTime(String time) {
        if (StringHelper.isEmpty(time)) {
            return true;
        }
yanzg's avatar
yanzg committed
51
        return StringHelper.compare(time, INIT_TIME.substring(0, time.length()));
yanzg's avatar
yanzg committed
52 53
    }

yanzg's avatar
yanzg committed
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
    /**
     * 判断日期是否需要初始化,当需要时,返回新的日期
     *
     * @param initDay 历史初始化日期
     * @param content 新的日期
     * @return 新的日期
     */
    public static final String getInitDay(String initDay, String content) {
        String today = DateHelper.getToday();
        String contentDay = DateHelper.getToday(content);
        if (!StringHelper.isEmpty(initDay)) {
            initDay = DateHelper.getToday(initDay);
            if (StringHelper.compare(contentDay, initDay)) {
                return StringHelper.EMPTY;
            }
        }
        if (!StringHelper.compare(contentDay, today)) {
            return StringHelper.EMPTY;
        }
        return today;
    }

yanzg's avatar
yanzg committed
76 77 78
    /**
     * 获取时间
     *
yanzg's avatar
yanzg committed
79 80
     * @param from           来源时间
     * @param initMillSecond 是否初始化毫秒为0
yanzg's avatar
yanzg committed
81
     * @return 结束时间
yanzg's avatar
yanzg committed
82
     */
yanzg's avatar
yanzg committed
83 84 85 86
    public static Date getDateTime(Object from, boolean initMillSecond) {
        if (StringHelper.isEmpty(from)) {
            return null;
        }
yanzg's avatar
yanzg committed
87
        try {
yanzg's avatar
yanzg committed
88
            Date to = null;
yanzg's avatar
yanzg committed
89
            if (from instanceof Date) {
yanzg's avatar
yanzg committed
90 91 92
                to = (Date) from;
            } else {
                to = DateAutoHelper.getAutoDate(String.valueOf(from));
yanzg's avatar
yanzg committed
93
            }
yanzg's avatar
yanzg committed
94 95
            to = initMillSecond(to);
            return to;
yanzg's avatar
yanzg committed
96
        } catch (Exception ex) {
yanzg's avatar
yanzg committed
97
            ExceptionHelper.handleException(DateHelper.class, ex, from);
yanzg's avatar
yanzg committed
98 99 100 101
        }
        return null;
    }

yanzg's avatar
yanzg committed
102 103 104 105 106 107 108 109

    /**
     * 组合日期和时间
     *
     * @param today 日期
     * @param time  时间
     * @return today(日期)+时间
     */
yanzg's avatar
yanzg committed
110
    public static Date mergeTodayTime(Object today, String time) {
yanzg's avatar
yanzg committed
111 112 113 114 115 116 117 118 119
        if (StringHelper.isEmpty(today)) {
            return null;
        }
        time = StringHelper.getFirst(time, "00:00:00");
        String day = DateHelper.getToday(today);
        String toResult = String.format("%s %s", day, time);
        return DateHelper.getDateTime(toResult);
    }

yanzg's avatar
yanzg committed
120 121 122 123 124 125 126 127 128 129
    /**
     * 获取时间,会自动初始化毫秒为0
     *
     * @param from 来源时间
     * @return 结束时间
     */
    public static Date getDateTime(Object from) {
        return getDateTime(from, true);
    }

yanzg's avatar
yanzg committed
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
    /**
     * Timestamp 转成 "yyyy-MM-dd HH:mm:ss"字符串
     *
     * @param date 需要处理的日期
     * @return 转换后的字符串
     */
    public static String toString(Timestamp date) {
        if (date == null) {
            return StringHelper.EMPTY;
        }
        SimpleDateFormat format = new SimpleDateFormat(FORMAT_SECOND_STRING);
        return format.format(date);
    }

    /**
     * 取得当前日期对象
     *
     * @return 返回java.util.Date日期对象
     */
    public static Date getCurDate() {
        return new Date();
    }

    /**
     * 将指定Date类型转换成指定格式的字符串,格式串参见类注释
     *
     * @param date   日期方式
     * @param format 指定的格式,当format为NULL或空串时,<BR>
     *               默认为 yyyy-MM-dd 格式
     * @return 当date为NULL时, 返回空串
     */
    public static String getDate(Date date, String format) {
        if (date == null) {
            return StringHelper.EMPTY;
        }
        if (format == null || format.length() == 0) {
            format = "yyyy-MM-dd";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 获取日期 yyyy-MM-dd
     *
     * @param date 日期参数
     * @return 返回的结果
     */
    public static String getYearMonthDay(Date date) {
        return getDate(date, FORMAT_DAY_STRING);
    }

    /**
     * 取得当前日期的字符串表示,格式为 yyyy-MM-dd
     *
     * @return 返回日期的字符串表示
     */
    public static String getToday() {
        return getYearMonthDay(getCurDate());
    }

yanzg's avatar
yanzg committed
191 192
    /**
     * 取得当前日期的字符串表示,格式为 yyyy-MM-dd
yanzg's avatar
yanzg committed
193
     *
yanzg's avatar
yanzg committed
194 195 196 197 198 199 200 201 202
     * @param date
     * @return
     */
    public static String getToday(Object date) {
        return getYearMonthDay(DateHelper.getDateTime(date));
    }

    /**
     * 取得当前日期的字符串表示,格式为 yyyy-MM-dd
yanzg's avatar
yanzg committed
203
     *
yanzg's avatar
yanzg committed
204 205 206 207 208 209
     * @param date
     * @return
     */
    public static String getToday(Date date) {
        return getYearMonthDay(date);
    }
yanzg's avatar
yanzg committed
210

yanzg's avatar
yanzg committed
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
    /**
     * 获取日期 yyyy-MM-dd HH:00:00
     *
     * @param date 日期参数
     * @return 返回的结果
     */
    public static String getYearMonthDayHour(Date date) {
        return getDate(date, FORMAT_DAY_HOUR_STRING);
    }

    /**
     * 取得当前日期的字符串表示,格式为 yyyy-MM-dd HH:00:00
     *
     * @return 返回日期的字符串表示
     */
    public static String getTodayHour() {
        return getYearMonthDayHour(getCurDate());
    }

    /**
     * 取得当前日期的字符串表示,格式为 yyyy-MM-dd HH:00:00
     *
     * @param date
     * @return
     */
    public static String getTodayHour(Object date) {
        return getYearMonthDayHour(DateHelper.getDateTime(date));
    }

    /**
     * 取得当前日期的字符串表示,格式为 yyyy-MM-dd HH:00:00
     *
     * @param date
     * @return
     */
    public static String getTodayHour(Date date) {
        return getYearMonthDayHour(date);
    }

yanzg's avatar
yanzg committed
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
    /**
     * 获取年份
     *
     * @param date 需要处理的日期
     * @return 获取到的年份
     */
    public static int getYear(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.YEAR);
    }

    /**
     * 获取月份
     *
     * @param date 需要处理的日期
     * @return 获取到的月份
     */
    public static int getMonth(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.MONTH);
    }

    /**
     * 获取日期
     *
     * @param date 需要处理的日期
     * @return 获取的天数
     */
    public static int getDay(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 获取当天的日期
     *
     * @param date 需要的日期
     * @return 返回的日期
     */
    public static Calendar getDayCalendarBegin(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        //当前起始日期
        Calendar begin = Calendar.getInstance();
        begin.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
yanzg's avatar
yanzg committed
298
        begin.set(Calendar.MILLISECOND, 0);
yanzg's avatar
yanzg committed
299 300 301
        return begin;
    }

yanzg's avatar
yanzg committed
302 303 304 305 306 307 308 309 310
    /**
     * 获取当天的日期
     *
     * @param date 需要的日期
     * @return 返回的日期
     */
    public static Date initMillSecond(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
yanzg's avatar
yanzg committed
311 312
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
yanzg's avatar
yanzg committed
313 314
    }

yanzg's avatar
yanzg committed
315 316 317 318 319 320 321
    private static void setDayEnd(Calendar cal) {
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        cal.set(Calendar.MILLISECOND, 999);
    }

yanzg's avatar
yanzg committed
322 323 324 325 326 327 328
    private static void setDayStart(Calendar cal) {
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
    }

yanzg's avatar
yanzg committed
329

yanzg's avatar
yanzg committed
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
    /**
     * 获取某一天起始和结束时间
     *
     * @param date 某一天
     * @return 返回的日期
     */
    public static Date getDayStart(Date date) {
        Calendar begin = getDayCalendarBegin(date);
        return begin.getTime();
    }

    /**
     * 获取某一天起始和结束时间
     *
     * @param date 某一天
     * @return 返回的日期
     */
    public static Date getDayEnd(Date date) {
        Calendar end = getDayCalendarBegin(date);
yanzg's avatar
yanzg committed
349
        setDayEnd(end);
yanzg's avatar
yanzg committed
350 351 352 353 354 355 356 357 358 359 360
        return end.getTime();
    }


    /**
     * 获取本月开始时间
     *
     * @param date 某一天
     * @return 返回的日期
     */
    public static Date getMonthStart(Date date) {
yanzg's avatar
yanzg committed
361 362
        Calendar cal = getDayCalendarBegin(date);
        cal.set(Calendar.DAY_OF_MONTH, 1);
yanzg's avatar
yanzg committed
363
        setDayStart(cal);
yanzg's avatar
yanzg committed
364
        return cal.getTime();
yanzg's avatar
yanzg committed
365 366 367 368 369 370 371 372 373 374 375
    }

    /**
     * 获得本月最后一天24点时间
     *
     * @param date 某一天
     * @return 返回的值
     */
    public static Date getMonthEnd(Date date) {
        Calendar cal = getDayCalendarBegin(date);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
yanzg's avatar
yanzg committed
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
        setDayEnd(cal);
        return cal.getTime();
    }


    /**
     * 获取本季度开始时间
     *
     * @param date 某一天
     * @return 返回的日期
     */
    public static Date getMonth3Start(Date date) {
        Calendar cal = getDayCalendarBegin(date);
        int month = cal.get(Calendar.MONTH) / 3 * 3;
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.DAY_OF_MONTH, 1);
yanzg's avatar
yanzg committed
392
        setDayStart(cal);
yanzg's avatar
yanzg committed
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
        return cal.getTime();
    }

    /**
     * 获得本月最后一天24点时间
     *
     * @param date 某一天
     * @return 返回的值
     */
    public static Date getMonth3End(Date date) {
        Calendar cal = getDayCalendarBegin(date);
        int month = cal.get(Calendar.MONTH) / 3 * 3;
        cal.set(Calendar.MONTH, month + 2);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        setDayEnd(cal);
yanzg's avatar
yanzg committed
408 409 410 411 412 413 414 415 416 417
        return cal.getTime();
    }

    /**
     * 获取本年开始时间
     *
     * @param date 某一天
     * @return 返回值
     */
    public static Date getYearStart(Date date) {
yanzg's avatar
yanzg committed
418 419 420
        Calendar cal = getDayCalendarBegin(date);
        cal.set(Calendar.MONTH, 0);
        cal.set(Calendar.DAY_OF_MONTH, 1);
yanzg's avatar
yanzg committed
421
        setDayStart(cal);
yanzg's avatar
yanzg committed
422 423 424 425 426 427 428 429 430 431 432 433 434
        return cal.getTime();
    }

    /**
     * 获取本年结束时间
     *
     * @param date 某一天
     * @return 返回值
     */
    public static Date getYearEnd(Date date) {
        Calendar cal = getDayCalendarBegin(date);
        cal.set(Calendar.MONTH, 11);
        cal.set(Calendar.DAY_OF_MONTH, 31);
yanzg's avatar
yanzg committed
435
        setDayEnd(cal);
yanzg's avatar
yanzg committed
436
        return cal.getTime();
yanzg's avatar
yanzg committed
437 438
    }

yanzg's avatar
yanzg committed
439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456
    /**
     * 当日期长度只有到日期时,在最后免补足时间
     *
     * @param from
     * @param patchHour
     * @return
     */
    public static String initDate(String from, String patchHour) {
        if (StringHelper.isEmpty(from)) {
            return from;
        }
        if (from.length() <= 10) {
            return from + patchHour;
        } else {
            return from;
        }
    }

yanzg's avatar
yanzg committed
457 458 459 460 461 462 463 464 465 466 467 468 469 470
    /**
     * 本季度开始时间
     *
     * @param date 某一天
     * @return 返回值
     */
    public static Date getQuarterStart(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int currentMonth = c.get(Calendar.MONTH) + 1;
        SimpleDateFormat longSdf = new SimpleDateFormat(FORMAT_SECOND_STRING);
        SimpleDateFormat shortSdf = new SimpleDateFormat(FORMAT_DAY_STRING);
        Date now = null;
        try {
yanzg's avatar
yanzg committed
471
            if (currentMonth >= MONTH_1 && currentMonth <= MONTH_3) {
yanzg's avatar
yanzg committed
472
                c.set(Calendar.MONTH, 0);
yanzg's avatar
yanzg committed
473 474 475 476 477 478
            } else if (currentMonth >= MONTH_4 && currentMonth <= MONTH_6) {
                c.set(Calendar.MONTH, MONTH_3);
            } else if (currentMonth >= MONTH_7 && currentMonth <= MONTH_9) {
                c.set(Calendar.MONTH, MONTH_6);
            } else if (currentMonth >= MONTH_10 && currentMonth <= MONTH_12) {
                c.set(Calendar.MONTH, MONTH_9);
yanzg's avatar
yanzg committed
479
            }
yanzg's avatar
yanzg committed
480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
            c.set(Calendar.DATE, 1);
            now = longSdf.parse(shortSdf.format(c.getTime()) + " 00:00:00");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return now;
    }

    /**
     * 本季度的结束时间,即2012-03-31 23:59:59
     *
     * @param date 某一天
     * @return 返回值
     */
    public static Date getQuarterEnd(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getQuarterStart(date));
        cal.add(Calendar.MONTH, 3);
        cal.add(Calendar.MILLISECOND, -1);
        return cal.getTime();
    }

    /**
     * 获取当前时间的年、月
     *
     * @param format 需要的格式
     * @return 返回值
     */
    public static String geYearMonth(String format) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 获取当前时间的年
     *
     * @return 当前年份
     */
    public static String getCurrentYear() {
        Calendar calendar = Calendar.getInstance();
        return calendar.get(Calendar.YEAR) + "";
    }

    /**
     * 将时间格式转为yyyy-MM-dd HH:mm:ss格式
     *
     * @param date 某一天
     * @return 返回值
     */
    public static String parseToStr(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_SECOND_STRING);
        return sdf.format(date);
    }


    /**
     * 判断字符串日期是否为同一天
     *
     * @param strFrom 对比的某一天
     * @param strTo   对比的某一天
     * @return 需要的返回值
     */
    public static boolean isEqualsDay(String strFrom, String strTo) {
        try {
            Date dateFrom = DateAutoHelper.getAutoDate(strFrom);
            Date dateTo = DateAutoHelper.getAutoDate(strTo);
            SimpleDateFormat format = new SimpleDateFormat(FORMAT_DAY_STRING);
            return format.format(dateFrom).equals(format.format(dateTo));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 判断两个日期是否为同一年(排除同月同天的情况)
     *
     * @param dateFrom 对比的某一天
     * @param dateTo   对比的某一天
     * @return 需要的返回值
     */
    public static boolean isEqualsYear(Date dateFrom, Date dateTo) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy");
        return format.format(dateFrom).equals(format.format(dateTo));
    }

    /**
     * 判断两个日期是否为同一月
     *
     * @param dateFrom 对比的某一天
     * @param dateTo   对比的某一天
     * @return 需要的返回值
     */
    public static boolean isEqualsMonth(Date dateFrom, Date dateTo) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
        return format.format(dateFrom).equals(format.format(dateTo));
    }

    /**
     * 计算两个日期之间相差的天数
     *
     * @param from 较小的时间
     * @param to   较大的时间
     * @return 相差天数
     */
    public static long betweenDay(Date from, Date to) {
        long mill = betweenMillSecond(from, to, FORMAT_DAY_STRING);
        return mill / (1000 * 3600 * 24);
    }

    /**
     * 计算两个日期之间相差的秒数
     *
     * @param from 较小的时间
     * @param to   较大的时间
     * @return 相差秒数
     */
    public static long betweenSecond(Date from, Date to) {
        long mill = betweenMillSecond(from, to, FORMAT_SECOND_STRING);
        return mill / 1000;
    }

    /**
     * 计算两个时间相差的毫秒数
     *
     * @param from   开始时间
     * @param to     结束时间
     * @param format 通过format来确定精度
     * @return 相差毫秒数
     */
    public static long betweenMillSecond(Date from, Date to, String format) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            from = sdf.parse(sdf.format(from));
            to = sdf.parse(sdf.format(to));

            Calendar cal = Calendar.getInstance();
            cal.setTime(from);
            long fromMill = cal.getTimeInMillis();
            cal.setTime(to);
            long toMill = cal.getTimeInMillis();
            long mill = toMill - fromMill;
            return mill;
        } catch (ParseException ex) {
yanzg's avatar
yanzg committed
625
            throw new RuntimeException(ex);
yanzg's avatar
yanzg committed
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666
        }
    }

    /**
     * 获取周,从星期1开始,索引号为0
     *
     * @param dt 传入时间
     * @return 星期序号
     */
    public static int getWeek(Date dt) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        int w = cal.get(Calendar.DAY_OF_WEEK);
        if (w < 1) {
            w = 1;
        }
        w = (w + 5) % 7;
        return w;
    }

    /**
     * 获取当前日期是星期几<br>
     *
     * @param dt 传入的时间
     * @return 当前日期是星期几
     */
    public static String getWeekName(Date dt) {
        String[] weekDays = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
        int w = getWeek(dt);
        return weekDays[w];
    }

    /**
     * 根据时间字符串获取对应的周几
     *
     * @param date 时间字符串
     * @return 获取后的结果
     */
    public static String getWeekName1(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
yanzg's avatar
yanzg committed
667 668 669
        int weekIndex = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (weekIndex < 0) {
            weekIndex = 0;
yanzg's avatar
yanzg committed
670 671
        }
        String[] weeks = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
yanzg's avatar
yanzg committed
672
        return weeks[weekIndex];
yanzg's avatar
yanzg committed
673 674 675 676 677 678 679
    }

    /**
     * 增加年份处理
     *
     * @param date 当前日期
     * @param year 需要增加的年份
yanzg's avatar
yanzg committed
680
     * @return 增加之后的值
yanzg's avatar
yanzg committed
681 682 683 684 685 686 687 688
     */
    public static Date addYear(Date date, int year) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.YEAR, year);
        return cal.getTime();
    }

yanzg's avatar
yanzg committed
689 690 691
    /**
     * 增加月份处理
     *
yanzg's avatar
yanzg committed
692
     * @param date  当前日期
yanzg's avatar
yanzg committed
693 694 695 696 697 698 699 700 701 702 703 704 705 706
     * @param month 需要增加的月份
     * @return 增加之后的值
     */
    public static Date addMonth(Date date, int month) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, month);
        return cal.getTime();
    }

    /**
     * 增加日期处理
     *
     * @param date 当前日期
yanzg's avatar
yanzg committed
707
     * @param day  需要增加的日期
yanzg's avatar
yanzg committed
708 709 710 711 712 713 714 715 716
     * @return 增加之后的值
     */
    public static Date addDay(Date date, int day) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, day);
        return cal.getTime();
    }

yanzg's avatar
yanzg committed
717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733
    /**
     * 增加小时处理
     *
     * @param date 当前日期
     * @param hour 需要增加的小时
     * @return 增加之后的值
     */
    public static Date addHour(Date date, int hour) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR, hour);
        return cal.getTime();
    }

    /**
     * 增加分钟处理
     *
yanzg's avatar
yanzg committed
734
     * @param date   当前日期
yanzg's avatar
yanzg committed
735 736 737 738 739 740 741 742 743 744 745 746 747
     * @param minute 需要增加的分钟
     * @return 增加之后的值
     */
    public static Date addMinute(Date date, int minute) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MINUTE, minute);
        return cal.getTime();
    }

    /**
     * 增加秒处理
     *
yanzg's avatar
yanzg committed
748
     * @param date   当前日期
yanzg's avatar
yanzg committed
749 750 751 752 753 754
     * @param second 需要增加的分钟
     * @return 增加之后的值
     */
    public static Date addSecond(Date date, int second) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
yanzg's avatar
yanzg committed
755
        cal.add(Calendar.SECOND, second);
yanzg's avatar
yanzg committed
756 757 758
        return cal.getTime();
    }

yanzg's avatar
yanzg committed
759 760 761 762 763 764
    /**
     * 获取当前时间,精准到秒,格式为: yyyy-MM-dd HH:mm:ss
     *
     * @return 当前时间
     */
    public static String getNow() {
yanzg's avatar
yanzg committed
765
        return getDateTimeString(new Date());
yanzg's avatar
yanzg committed
766 767 768 769 770 771 772 773
    }

    /**
     * 获取时间的字符串,精准到秒,为null则返回空字符串,格式为: yyyy-MM-dd HH:mm:ss
     *
     * @param date 需要获取的时间
     * @return 获取到的结果
     */
yanzg's avatar
yanzg committed
774 775
    public static String getDateTimeString(Date date) {
        return getDateTimeString(FORMAT_SECOND_STRING, date);
yanzg's avatar
yanzg committed
776 777 778 779 780 781 782
    }

    /**
     * 获取时间为指定格式的字符串,为null则返回空字符串
     *
     * @param format 格式 yyyy-MM-dd HH:mm:ss
     * @param date   字符串
yanzg's avatar
yanzg committed
783
     * @return 转换后的结果
yanzg's avatar
yanzg committed
784
     */
yanzg's avatar
yanzg committed
785
    public static String getDateTimeString(String format, Date date) {
yanzg's avatar
yanzg committed
786 787 788 789 790 791 792
        String to = "";
        if (date != null) {
            to = new SimpleDateFormat(format).format(date);
        }
        return to;
    }

yanzg's avatar
yanzg committed
793 794 795 796 797 798 799 800 801 802 803 804
    /**
     * 获取时间为指定格式的字符串,为null则返回空字符串
     *
     * @param format 格式 yyyy-MM-dd HH:mm:ss
     * @param date   字符串
     * @return 转换后的结果
     */
    public static String getDateTimeString(String format, String date) {
        Date dt = getDateTime(date);
        return getDateTimeString(format, dt);
    }

yanzg's avatar
yanzg committed
805 806 807 808
    /**
     * 比较时间
     *
     * @param from 对比时间
yanzg's avatar
yanzg committed
809 810
     * @param to   结束时间
     * @return 对别结果
yanzg's avatar
yanzg committed
811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841
     */
    public static int compare(Date from, Date to) {
        if (from == null && to == null) {
            return 0;
        } else if (from == null) {
            return 1;
        } else if (to == null) {
            return -1;
        } else if (from.getTime() < to.getTime()) {
            return 1;
        } else if (from.getTime() > to.getTime()) {
            return -1;
        } else {
            return 0;
        }
    }


    /**
     * 将时间字符串格式化为 yyyy-MM-dd hh:mm:ss
     *
     * @param from 需要格式化的字符串
     * @return 格式化后的结果
     * @throws ParseException 可能抛出不能解释字符串的异常
     */
    public static String formatDateString(String from) {
        try {
            SimpleDateFormat format = new SimpleDateFormat(FORMAT_SECOND_STRING);
            Date dt = format.parse(from);
            return format.format(dt);
        } catch (ParseException e) {
yanzg's avatar
yanzg committed
842
            throw new RuntimeException(e);
yanzg's avatar
yanzg committed
843 844 845 846 847 848 849 850 851 852
        }
    }


    /**
     * 判断时间是否在时间段内
     *
     * @param date 当前时间 yyyy-MM-dd HH:mm:ss
     * @param from 开始时间 00:00:00
     * @param to   结束时间 00:05:00
yanzg's avatar
yanzg committed
853
     * @return 是否在时间范围之内
yanzg's avatar
yanzg committed
854 855
     */
    public static boolean isBetween(Date date, String from, String to) {
yanzg's avatar
yanzg committed
856 857 858
        if (date == null) {
            return false;
        }
yanzg's avatar
yanzg committed
859 860
        Date fromDate = getDateTime(getDateTimeString(FORMAT_DAY_STRING + " " + from, date));
        Date toDate = getDateTime(getDateTimeString(FORMAT_DAY_STRING + " " + to, date));
yanzg's avatar
yanzg committed
861 862 863
        if (fromDate != null && date.getTime() < fromDate.getTime()) {
            return false;
        }
yanzg's avatar
yanzg committed
864
        return toDate == null || date.getTime() <= toDate.getTime();
yanzg's avatar
yanzg committed
865 866 867 868 869 870 871 872 873 874 875 876 877
    }

    /**
     * 获取当前日期
     *
     * @param from 当前时间 yyyy-MM-dd HH:mm:ss
     * @return 返回日期: yyyy-MM-dd
     */
    public static String toDay(String from) {
        if (StringHelper.isEmpty(from)) {
            return from;
        }
        try {
yanzg's avatar
yanzg committed
878 879
            SimpleDateFormat format = new SimpleDateFormat(FORMAT_DAY_STRING);
            return format.format(format.parse(from));
yanzg's avatar
yanzg committed
880
        } catch (ParseException e) {
yanzg's avatar
yanzg committed
881
            ExceptionHelper.handleException(DateHelper.class, e, from);
yanzg's avatar
yanzg committed
882 883 884 885 886 887 888 889 890 891 892
        }
        return StringHelper.EMPTY;
    }

    /**
     * 获取当前日期字符串
     *
     * @param date 需要获取的日期
     * @return 获取到的日期字符串
     */
    public static String toDay(Date date) {
yanzg's avatar
yanzg committed
893 894
        SimpleDateFormat format = new SimpleDateFormat(FORMAT_DAY_STRING);
        return format.format(date);
yanzg's avatar
yanzg committed
895 896 897 898 899 900 901 902 903
    }

    /**
     * 获取当前日期
     *
     * @param date 需要获取的日期
     * @return 获取到的日期字符串
     */
    public static String toDay(long date) {
yanzg's avatar
yanzg committed
904 905
        SimpleDateFormat format = new SimpleDateFormat(FORMAT_DAY_STRING);
        return format.format(new Date(date));
yanzg's avatar
yanzg committed
906 907 908 909 910 911 912 913 914
    }

    /**
     * 获取指定时间月份的第一天
     *
     * @param time 需要获取的时间
     * @return 指定时间月份的第一天
     */
    public static String toMonth(Date time) {
yanzg's avatar
yanzg committed
915
        return getDateTimeString(FORMAT_MONTH_STRING, time);
yanzg's avatar
yanzg committed
916 917 918 919 920 921 922 923 924
    }

    /**
     * 获取指定时间年份的第一天
     *
     * @param time 需要获取的时间
     * @return 指定时间年份的第一天
     */
    public static String toYear(Date time) {
yanzg's avatar
yanzg committed
925
        return getDateTimeString(FORMAT_YEAR_STRING, time);
yanzg's avatar
yanzg committed
926
    }
yanzg's avatar
yanzg committed
927 928 929 930 931 932 933 934 935 936 937 938 939 940

    /**
     * 判断是否时时间格式字符串
     *
     * @param from 来源字符串
     * @return 是否时时间字符串
     */
    public static boolean isDateFormat(String from) {
        try {
            return DateAutoHelper.getAutoDate(from) != null;
        } catch (Exception ex) {
            return false;
        }
    }
yanzg's avatar
yanzg committed
941

yanzg's avatar
yanzg committed
942 943
    private static final long MINUTE_UNIT = 1000 * 60;
    private static final long HOUR_MINUTE_UNIT = 15;
yanzg's avatar
yanzg committed
944 945 946 947 948 949 950 951

    /**
     * 获取小时中的刻度时间
     *
     * @param from 来源时间
     * @return
     */
    public static String getHourUnitTime(Object from) {
yanzg's avatar
yanzg committed
952 953 954 955 956 957 958 959 960 961
        return getHourUnitTime(from, HOUR_MINUTE_UNIT);
    }

    /**
     * 获取小时中的刻度时间
     *
     * @param from 来源时间
     * @return
     */
    public static String getHourUnitTime(Object from, long minute) {
yanzg's avatar
yanzg committed
962 963 964 965
        Date dateTime = getDateTime(from);
        if (dateTime == null) {
            return null;
        }
966
        // 获取当前小时,用于累加
967
        Date hour = DateHelper.getDateTime(DateHelper.getDateTimeString("yyyy-MM-dd HH:00:00.000", dateTime));
968
        // 获取当前小时毫秒数量
yanzg's avatar
yanzg committed
969
        long totalMill = dateTime.getTime() - hour.getTime();
970
        // 计算分钟单位
yanzg's avatar
yanzg committed
971
        long unit = totalMill / MINUTE_UNIT / minute;
972
        // 计算四舍五入后的时间
yanzg's avatar
yanzg committed
973
        Date to = new Date(hour.getTime() + unit * MINUTE_UNIT * minute);
974
        // 将时间转换为字符串
yanzg's avatar
yanzg committed
975 976
        return DateHelper.getDateTimeString(to);
    }
yanzg's avatar
yanzg committed
977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001


    /**
     * 获取小时中的刻度时间
     *
     * @param from 来源时间
     * @return
     */
    public static int getMonthBetween(Object from, Object to) {
        Date fromDate = getDateTime(from);
        Date toDate = getDateTime(to);
        if (from == null || toDate == null) {
            return 0;
        }
        Calendar bef = Calendar.getInstance();
        bef.setTime(fromDate);
        Calendar aft = Calendar.getInstance();
        aft.setTime(getDateTime(toDate));
        int surplus = aft.get(Calendar.DATE) - bef.get(Calendar.DATE);
        int result = aft.get(Calendar.MONTH) - bef.get(Calendar.MONTH);
        int month = (aft.get(Calendar.YEAR) - bef.get(Calendar.YEAR)) * 12;
        surplus = surplus <= 0 ? 1 : 0;
        return (Math.abs(month + result) + surplus);
    }

yanzg's avatar
yanzg committed
1002
}