`

Java自用日期时间工具类

    博客分类:
  • java
阅读更多

项目中可能用到的一些精华如下:

 

package com.framework.util;

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

/**
 * 日期时间工具类<br>
 * 提供一些常用的日期时间操作方法,所有方法都为静态,不用实例化该类即可使用。<br><br>
 * 下为日期格式的简单描述详情请参看java API中java.text.SimpleDateFormat<br>
 * The following pattern letters are defined (all other characters from
 * <code>'A'</code> to <code>'Z'</code> and from <code>'a'</code> to
 * <code>'z'</code> are reserved):
 * <blockquote>
 * <table border=0 cellspacing=3 cellpadding=0>
 *     <tr bgcolor="#ccccff">
 *         <th align=left>Letter
 *         <th align=left>Date or Time Component
 *         <th align=left>Presentation
 *         <th align=left>Examples
 *     <tr>
 *         <td><code>G</code>
 *         <td>Era designator

 *         <td><a href="#text">Text</a>
 *         <td><code>AD</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>y</code>
 *         <td>Year
 *         <td><a href="#year">Year</a>
 *         <td><code>1996</code>; <code>96</code>
 *     <tr>
 *         <td><code>M</code>
 *         <td>Month in year
 *         <td><a href="#month">Month</a>
 *         <td><code>July</code>; <code>Jul</code>; <code>07</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>w</code>
 *         <td>Week in year
 *         <td><a href="#number">Number</a>
 *         <td><code>27</code>
 *     <tr>
 *         <td><code>W</code>
 *         <td>Week in month
 *         <td><a href="#number">Number</a>
 *         <td><code>2</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>D</code>
 *         <td>Day in year
 *         <td><a href="#number">Number</a>
 *         <td><code>189</code>
 *     <tr>
 *         <td><code>d</code>
 *         <td>Day in month
 *         <td><a href="#number">Number</a>
 *         <td><code>10</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>F</code>
 *         <td>Day of week in month
 *         <td><a href="#number">Number</a>
 *         <td><code>2</code>
 *     <tr>
 *         <td><code>E</code>
 *         <td>Day in week
 *         <td><a href="#text">Text</a>
 *         <td><code>Tuesday</code>; <code>Tue</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>a</code>
 *         <td>Am/pm marker
 *         <td><a href="#text">Text</a>
 *         <td><code>PM</code>
 *     <tr>
 *         <td><code>H</code>
 *         <td>Hour in day (0-23)
 *         <td><a href="#number">Number</a>
 *         <td><code>0</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>k</code>
 *         <td>Hour in day (1-24)
 *         <td><a href="#number">Number</a>
 *         <td><code>24</code>
 *     <tr>
 *         <td><code>K</code>
 *         <td>Hour in am/pm (0-11)
 *         <td><a href="#number">Number</a>
 *         <td><code>0</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>h</code>
 *         <td>Hour in am/pm (1-12)
 *         <td><a href="#number">Number</a>
 *         <td><code>12</code>
 *     <tr>
 *         <td><code>m</code>
 *         <td>Minute in hour
 *         <td><a href="#number">Number</a>
 *         <td><code>30</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>s</code>
 *         <td>Second in minute
 *         <td><a href="#number">Number</a>
 *         <td><code>55</code>
 *     <tr>
 *         <td><code>S</code>
 *         <td>Millisecond
 *         <td><a href="#number">Number</a>
 *         <td><code>978</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>z</code>
 *         <td>Time zone
 *         <td><a href="#timezone">General time zone</a>
 *         <td><code>Pacific Standard Time</code>; <code>PST</code>; <code>GMT-08:00</code>
 *     <tr>
 *         <td><code>Z</code>
 *         <td>Time zone
 *         <td><a href="#rfc822timezone">RFC 822 time zone</a>
 *         <td><code>-0800</code>
 * </table>
 * </blockquote>
 *<h4>Examples</h4>
 *
 * The following examples show how date and time patterns are interpreted in
 * the U.S. locale. The given date and time are 2001-07-04 12:08:56 local time
 * in the U.S. Pacific Time time zone.
 * <blockquote>
 * <table border=0 cellspacing=3 cellpadding=0>
 *     <tr bgcolor="#ccccff">
 *         <th align=left>Date and Time Pattern
 *         <th align=left>Result
 *     <tr>
 *         <td><code>"yyyy.MM.dd G 'at' HH:mm:ss z"</code>
 *         <td><code>2001.07.04 AD at 12:08:56 PDT</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>"EEE, MMM d, ''yy"</code>
 *         <td><code>Wed, Jul 4, '01</code>
 *     <tr>
 *         <td><code>"h:mm a"</code>
 *         <td><code>12:08 PM</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>"hh 'o''clock' a, zzzz"</code>
 *         <td><code>12 o'clock PM, Pacific Daylight Time</code>
 *     <tr>
 *         <td><code>"K:mm a, z"</code>
 *         <td><code>0:08 PM, PDT</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>"yyyyy.MMMMM.dd GGG hh:mm aaa"</code>
 *         <td><code>02001.July.04 AD 12:08 PM</code>
 *     <tr>
 *         <td><code>"EEE, d MMM yyyy HH:mm:ss Z"</code>
 *         <td><code>Wed, 4 Jul 2001 12:08:56 -0700</code>
 *     <tr bgcolor="#eeeeff">
 *         <td><code>"yyMMddHHmmssZ"</code>
 *         <td><code>010704120856-0700</code>
 * </table>
 * </blockquote>
 *
 */

public class DateTimeUtil {

  /**
   * 缺省的日期显示格式: yyyy-MM-dd
   */
  public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";

  /**
   * 缺省的日期时间显示格式:yyyy-MM-dd HH:mm:ss
   */
  public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

  /**
   * 私有构造方法,禁止对该类进行实例化
   */
  private DateTimeUtil() {}

  /**
   * 得到系统当前日期时间
   * @return 当前日期时间
   */
  public static Date getNow() {
    return Calendar.getInstance().getTime();
  }

  /**
   * 得到用缺省方式格式化的当前日期
   * @return 当前日期
   */
  public static String getDate() {
    return getDateTime(DEFAULT_DATE_FORMAT);
  }

  /**
   * 得到用缺省方式格式化的当前日期及时间
   * @return 当前日期及时间
   */
  public static String getDateTime() {
    return getDateTime(DEFAULT_DATETIME_FORMAT);
  }

  /**
   * 得到系统当前日期及时间,并用指定的方式格式化
   * @param pattern 显示格式
   * @return 当前日期及时间
   */
  public static String getDateTime(String pattern) {
    Date datetime = Calendar.getInstance().getTime();
    return getDateTime(datetime, pattern);
  }

  /**
   * 得到用指定方式格式化的日期
   * @param date 需要进行格式化的日期
   * @param pattern 显示格式
   * @return 日期时间字符串
   */
  public static String getDateTime(Date date, String pattern) {
    if (null == pattern || "".equals(pattern)) {
      pattern = DEFAULT_DATETIME_FORMAT;
    }
    SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
    return dateFormat.format(date);
  }

  /**
   * 得到当前年份
   * @return 当前年份
   */
  public static int getCurrentYear() {
    return Calendar.getInstance().get(Calendar.YEAR);
  }

  /**
   * 得到当前月份
   * @return 当前月份
   */
  public static int getCurrentMonth() {
    //用get得到的月份数比实际的小1,需要加上
    return Calendar.getInstance().get(Calendar.MONTH) + 1;
  }

  /**
   * 得到当前日
   * @return 当前日
   */
  public static int getCurrentDay() {
    return Calendar.getInstance().get(Calendar.DATE);
  }

  /**
   * 取得当前日期以后若干天的日期。如果要得到以前的日期,参数用负数。
   * 例如要得到上星期同一天的日期,参数则为-7
   * @param days 增加的日期数
   * @return 增加以后的日期
   */
  public static Date addDays(int days) {
    return add(getNow(), days, Calendar.DATE);
  }

  /**
   * 取得指定日期以后若干天的日期。如果要得到以前的日期,参数用负数。
   * @param date 基准日期
   * @param days 增加的日期数
   * @return 增加以后的日期
   */
  public static Date addDays(Date date, int days) {
    return add(date, days, Calendar.DATE);
  }

  /**
   * 取得当前日期以后某月的日期。如果要得到以前月份的日期,参数用负数。
   * @param months 增加的月份数
   * @return 增加以后的日期
   */
  public static Date addMonths(int months) {
    return add(getNow(), months, Calendar.MONTH);
  }

  /**
   * 取得指定日期以后某月的日期。如果要得到以前月份的日期,参数用负数。
   * 注意,可能不是同一日子,例如2003-1-31加上一个月是2003-2-28
   * @param date 基准日期
   * @param months 增加的月份数

   * @return 增加以后的日期
   */
  public static Date addMonths(Date date, int months) {
    return add(date, months, Calendar.MONTH);
  }

  /**
   * 内部方法。为指定日期增加相应的天数或月数
   * @param date 基准日期
   * @param amount 增加的数量
   * @param field 增加的单位,年,月或者日
   * @return 增加以后的日期
   */
  private static Date add(Date date, int amount, int field) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(field, amount);
    return calendar.getTime();
  }

  /**
   * 计算两个日期相差天数。
   * 用第一个日期减去第二个。如果前一个日期小于后一个日期,则返回负数
   * @param one 第一个日期数,作为基准
   * @param two 第二个日期数,作为比较
   * @return 两个日期相差天数
   */
  public static long diffDays(Date one, Date two) {
    return (one.getTime() - two.getTime()) / (24 * 60 * 60 * 1000);
  }

  /**
   * 计算两个日期相差月份数
   * 如果前一个日期小于后一个日期,则返回负数
   * @param one 第一个日期数,作为基准
   * @param two 第二个日期数,作为比较
   * @return 两个日期相差月份数
   */
  public static int diffMonths(Date one, Date two) {
    Calendar calendar = Calendar.getInstance();
    //得到第一个日期的年分和月份数
    calendar.setTime(one);
    int yearOne = calendar.get(Calendar.YEAR);
    int monthOne = calendar.get(Calendar.MONDAY);
    //得到第二个日期的年份和月份
    calendar.setTime(two);
    int yearTwo = calendar.get(Calendar.YEAR);
    int monthTwo = calendar.get(Calendar.MONDAY);
    return (yearOne - yearTwo) * 12 + (monthOne - monthTwo);
  }

  /**
   * 将一个字符串用给定的格式转换为日期类型。<br>
   * 注意:如果返回null,则表示解析失败
   * @param datestr 需要解析的日期字符串
   * @param pattern 日期字符串的格式,默认为“yyyy-MM-dd”的形式
   * @return 解析后的日期
   */
  public static Date parse(String datestr, String pattern) {
    Date date = null;
    if (null == pattern || "".equals(pattern)) {
      pattern = DEFAULT_DATE_FORMAT;
    }
    try {
      SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
      date = dateFormat.parse(datestr);
    }
    catch (ParseException e) {
    }
    return date;
  }

  /**
   * 返回本月的最后一天
   * @return 本月最后一天的日期
   */
  public static Date getMonthLastDay() {
    return getMonthLastDay(getNow());
  }

  /**
   * 返回给定日期中的月份中的最后一天
   * @param date 基准日期
   * @return 该月最后一天的日期
   */
  public static Date getMonthLastDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    //将日期设置为下一月第一天
    calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, 1);
    //减去1天,得到的即本月的最后一天
    calendar.add(Calendar.DATE, -1);
    return calendar.getTime();
  }

  public static void main(String[] args) {

    String sss =getDateTime("yyyy年MM月dd日") ;
    String test = "2003-1-31";
    Date date;
    try {
      date = parse(test, "");

      System.out.println("得到当前日期 - getDate():" + DateTimeUtil.getDate());
      System.out.println("得到当前日期时间 - getDateTime():" + DateTimeUtil.getDateTime());

      System.out.println("得到当前年份 - getCurrentYear():" + DateTimeUtil.getCurrentYear());
      System.out.println("得到当前月份 - getCurrentMonth():" + DateTimeUtil.getCurrentMonth());
      System.out.println("得到当前日子 - getCurrentDay():" + DateTimeUtil.getCurrentDay());

      System.out.println("解析 - parse(" + test + "):" + getDateTime(date, "yyyy-MM-dd"));

      System.out.println("自增月份 - addMonths(3):" + getDateTime(addMonths(3), "yyyy-MM-dd"));
      System.out.println("增加月份 - addMonths(" + test + ",3):" + getDateTime(addMonths(date, 3), "yyyy-MM-dd"));
      System.out.println("增加日期 - addDays(" + test + ",3):" + getDateTime(addDays(date, 3), "yyyy-MM-dd"));
      System.out.println("自增日期 - addDays(3):" + getDateTime(addDays(3), "yyyy-MM-dd"));

      System.out.println("比较日期 - diffDays():" + DateTimeUtil.diffDays(DateTimeUtil.getNow(), date));
      System.out.println("比较月份 - diffMonths():" + DateTimeUtil.diffMonths(DateTimeUtil.getNow(), date));

      System.out.println("得到" + test + "所在月份的最后一天:" + getDateTime(getMonthLastDay(date), "yyyy-MM-dd"));

    }catch (Exception e) {
      System.out.println(e.getStackTrace());
    }
  }
}

 

持续更新中....

 

 

 

 

0
0
分享到:
评论

相关推荐

    自己用的工具类,自己写的

    工具类通常包含一系列静态方法,提供通用的功能,如数据处理、日期时间操作、字符串处理等,方便在不同的代码模块中复用。这类工具类是程序员根据自己的需求定制的,可能不具有广泛适用性,但对特定项目或开发环境...

    java分类面试资料-自用

    - **Java 8**:函数式编程(Lambda表达式,Stream API,Optional类)和日期时间API。 - **Java 11及以上**:模块系统,HTTP客户端,动态类型等。 这些都是Java面试中常见的技术点。深入理解和熟练应用这些知识将...

    java8新特性总结自用

    Java 8 提供了一个全新的日期时间 API,包括 `LocalDate`, `LocalTime`, `LocalDateTime`, `ZonedDateTime` 等,它们的设计更加合理且易于使用。 **示例**: ```java LocalDate today = LocalDate.now(); System....

    java日志文件过滤

    总的来说,这个“java日志文件过滤”项目提供了一个便捷的工具,帮助开发者快速处理和分析日志数据,提高了问题排查和系统监控的效率。通过学习和理解这个项目,你可以深化对Java日志处理、文件I/O和条件过滤等技术...

    文件上传下载servlet自用

    这通常涉及到Apache Commons FileUpload库的使用,该库提供了解析多部分数据并提取文件内容的工具。在Servlet中,我们需要创建一个解析器实例,然后对请求进行解析,获取到文件的InputStream,接着将其保存到服务器...

    jdk1.6(自用版).rar

    8. **国际化和本地化改进**:JDK 1.6扩展了对多种语言和文化的本地化支持,提供了更多的区域设置和日期时间格式,帮助开发者创建更加全球化的应用。 9. **调试和诊断工具**:JDK 1.6提供了更丰富的JDK工具,如...

    java SE 基础教程 新手友好 自己写的笔记

    - **时间类**:`java.util.Date` 用于处理日期和时间。 ### 总结 本教程涵盖了Java SE的基础知识点,从类和方法的概念到IDEA的使用技巧,再到Scanner类的详细介绍等。对于初学者来说,这些知识点是非常宝贵的资源,...

    JsonObject.rar

    3. `commons-lang-2.3.jar`:Apache Commons Lang,提供了一些Java语言没有但非常有用的工具类,如字符串处理、日期时间操作等。 4. `commons-beanutils-1.7.0.jar`:Apache Commons BeanUtils,简化了JavaBean属性...

    jdk-8u162-linux-x64

    JDK 8 是 Java 的一个重要版本,引入了许多新特性,如 Lambda 表达式、Stream API、方法引用来简化代码,以及新的日期和时间API等。对于学习和开发Java应用的人员来说,JDK 8u162 是一个可靠的版本,因为它经过了...

    jdk-8公司内网下载

    5. Date和Time API的改进:提供更强大、更易于使用的日期和时间处理类库。 6. 默认方法:接口中可以定义带有实现的方法,增强了接口的功能性。 了解这些特性对于Java开发者来说至关重要,因为它们极大地改变了编程...

    window_jdk_1.8_201

    Java 8的Date和Time API也得到了显著改进,引入了java.time包,提供更丰富的日期时间类,如LocalDate、LocalTime、LocalDateTime等,使得日期和时间的操作更加直观和灵活,避免了以前使用Calendar类时的复杂性。...

    Project:自用项目

    【标题】:“自用项目——安卓开发框架(MVP+主流框架+基类+工具类)” 【描述】中提到的“安卓开发框架”是指在Android应用开发中使用的一系列设计模式、库和组件,旨在提高开发效率和代码质量。这个项目集成了MVP...

    MoneyAccount:自用记账软件

    一个`Transaction`类来表示收支记录,包括交易金额、日期、类别等信息。通过这些类的实例化和方法调用,实现对记账数据的创建、读取、更新和删除(CRUD)操作。 此外,考虑到软件的实用性,MoneyAccount可能集成了...

Global site tag (gtag.js) - Google Analytics