博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个好的Java时间工具类DateTime
阅读量:4563 次
发布时间:2019-06-08

本文共 18229 字,大约阅读时间需要 60 分钟。

此类的灵感来源于C#

虽然网上有什么date4j,但是jar太纠结了,先给出源码,可以继承到自己的util包中,作为一个资深程序员,我相信都有不少好的util工具类,我也希望经过此次分享,能带动技术大牛们能分享出自己的好用的工具类。

先看源码

/*      * 岸思科技开发平台(JAVA) SDK      *      * Copyright (c) 2014, Ansitech Network Technology Co.,Ltd All rights reserved.      * http://www.ansitech.com/java/sdk/      *      * 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.ansitech.core.system;            import java.io.Serializable;      import java.text.DateFormat;      import java.text.ParseException;      import java.text.SimpleDateFormat;      import java.util.Calendar;      import java.util.Date;            /**      * 日期时间类      *      * 

对Calendar的封装,以便于使用

* * @author qsyang * @version 1.0 */ public class DateTime implements Serializable { /** * yyyy-MM-dd HH:mm:ss 格式 */ public static final String DEFAULT_DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss"; /** * yyyy-MM-dd HH:mm 格式 */ public static final String DEFAULT_DATE_TIME_HHmm_FORMAT_PATTERN = "yyyy-MM-dd HH:mm"; /** * yyyy-MM-dd HH 格式 */ public static final String DEFAULT_DATE_TIME_HH_FORMAT_PATTERN = "yyyy-MM-dd HH"; /** * yyyy-MM-dd 格式 */ public static final String DEFAULT_DATE_FORMAT_PATTERN = "yyyy-MM-dd"; /** * HH:mm:ss 格式 */ public static final String DEFAULT_TIME_FORMAT_PATTERN = "HH:mm:ss"; /** * HH:mm 格式 */ public static final String DEFAULT_TIME_HHmm_FORMAT_PATTERN = "HH:mm"; /** * 年 *

可以通过DateTime.now().get(DateTime.YEAR_FIELD)来获取当前时间的年

*/ public static final int YEAR_FIELD = java.util.Calendar.YEAR; /** * 月 *

可以通过DateTime.now().get(DateTime.MONTH_FIELD)来获取当前时间的月

*/ public static final int MONTH_FIELD = java.util.Calendar.MONTH; /** * 日 *

可以通过DateTime.now().get(DateTime.DAY_FIELD)来获取当前时间的日

*/ public static final int DAY_FIELD = java.util.Calendar.DATE; /** * 小时

可以通过DateTime.now().get(DateTime.HOUR_FIELD)来获取当前时间的小时

*/ public static final int HOUR_FIELD = java.util.Calendar.HOUR_OF_DAY; /** * 分钟

可以通过DateTime.now().get(DateTime.MINUTE_FIELD)来获取当前时间的分钟

*/ public static final int MINUTE_FIELD = java.util.Calendar.MINUTE; /** * 秒 *

可以通过DateTime.now().get(DateTime.SECOND_FIELD)来获取当前时间的秒

*/ public static final int SECOND_FIELD = java.util.Calendar.SECOND; /** * 毫秒

可以通过DateTime.now().get(DateTime.MILLISECOND_FIELD)来获取当前时间的毫秒

*/ public static final int MILLISECOND_FIELD = java.util.Calendar.MILLISECOND; private java.util.Calendar c; //日历类 /** * 获取一个DateTime,此DateTime尚未初始化,表示的时间是1970-1-1 00:00:00.000 *

要获取当前系统时间,请用DateTime.now();

*/ public DateTime() { c = Calendar.getInstance(); c.clear(); } /** * 设置时间

可以传入一个时间对象,将会被转换为DateTime类型

* * @param date 时间对象 */ public DateTime(java.util.Date date) { c = Calendar.getInstance(); c.setTime(date); } /** * 设置时间

可以传入一个日历对象,将会被转换为DateTime类型

* * @param calendar 日历对象 */ public DateTime(java.util.Calendar calendar) { this.c = calendar; } /** * 获取当前系统时间 * * @return DateTime 当前系统时间 */ public static DateTime now() { Calendar calendar = Calendar.getInstance(); return new DateTime(calendar); } /** * 用毫秒来设置时间, 时间的基数是1970-1-1 00:00:00.000;

比如,new DateTime(1000) * 则表示1970-1-1 00:00:01.000;

用负数表示基础时间以前的时间

* * @param milliseconds 毫秒 */ public DateTime(long milliseconds) { c = Calendar.getInstance(); c.setTimeInMillis(milliseconds); } /** * 转换为Date类型 * * @return Date时间 */ public Date toDate() { return c.getTime(); } /** * 转换成 日历对象 * * @return Calendar对象 */ public java.util.Calendar toCalendar() { return c; } /** * 转换成java.sql.Date(yyyy-MM-dd)日期 * * @return java.sql.Date日期 */ public java.sql.Date toSqlDate() { return new java.sql.Date(c.getTimeInMillis()); } /** * 转换为java.sql.Time(hh:mm:ss)时间 * * @return java.sql.Time时间 */ public java.sql.Time toSqlTime() { return new java.sql.Time(c.getTimeInMillis()); } /** * 转换为java.sql.Timestamp(时间戳) * * @return java.sql.Timestamp时间戳 */ public java.sql.Timestamp toSqlTimestamp() { return new java.sql.Timestamp(c.getTimeInMillis()); } /** * 解析时间

根据DateTime中的DEFAULT_TIME_FORMAT_PATTERN规则转换为hh:mm:ss或hh:mm格式

* * @param time 字符串格式时间 * @return DateTime 日期时间对象 */ public static DateTime parseTime(String time) throws java.text.ParseException { try { return DateTime.parseDateTime(time, DateTime.DEFAULT_TIME_FORMAT_PATTERN); } catch (ParseException e) { return DateTime.parseDateTime(time, DateTime.DEFAULT_TIME_HHmm_FORMAT_PATTERN); } } /** * 解析日期

根据DateTime中的DEFAULT_DATE_FORMAT_PATTERN规则转换为yyyy-MM-dd格式

* * @param date 字符串格式日期 * @return DateTime 日期时间类 */ public static DateTime parseDate(String date) throws java.text.ParseException { return DateTime.parseDateTime(date, DateTime.DEFAULT_DATE_FORMAT_PATTERN); } /** * 解析日期时间

根据DateTime中的DEFAULT_DATE_TIME_FORMAT_PATTERN规则转换为yyyy-MM-dd * HH:mm:ss格式

* * @param datetime 字符串格式日期时间 * @return DateTime 日期时间对象 */ public static DateTime parseDateTime(String datetime) throws java.text.ParseException { DateTime result = null; //尝试按yyyy-MM-dd HH:mm:ss分析 try { result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_FORMAT_PATTERN); } catch (ParseException e) { //解析错误 result = null; } //尝试按yyyy-MM-dd HH:mm分析 if (null == result) { try { result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_HHmm_FORMAT_PATTERN); } catch (ParseException e) { //解析错误 result = null; } } //尝试按yyyy-MM-dd HH分析 if (null == result) { try { result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_HH_FORMAT_PATTERN); } catch (ParseException e) { //解析错误 result = null; } } //尝试按yyyy-MM-dd分析 if (null == result) { try { result = DateTime.parseDate(datetime); } catch (ParseException e) { //解析错误 result = null; } } //尝试按时间分析 if (null == result) { result = DateTime.parseTime(datetime); } return result; } /** * 用指定的pattern分析字符串

pattern的用法参见java.text.SimpleDateFormat

* * @param datetime 字符串格式日期时间 * @param pattern 日期解析规则 * @return DateTime 日期时间对象 * @see java.text.SimpleDateFormat */ public static DateTime parseDateTime(String datetime, String pattern) throws java.text.ParseException { SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateInstance(); fmt.applyPattern(pattern); return new DateTime(fmt.parse(datetime)); } /** * 转换为 DEFAULT_DATE_FORMAT_PATTERN (yyyy-MM-dd) 格式字符串 * * @return yyyy-MM-dd格式字符串 */ public String toDateString() { return toDateTimeString(DateTime.DEFAULT_DATE_FORMAT_PATTERN); } /** * 转换为 DEFAULT_TIME_FORMAT_PATTERN (HH:mm:ss) 格式字符串 * * @return HH:mm:ss 格式字符串 */ public String toTimeString() { return toDateTimeString(DateTime.DEFAULT_TIME_FORMAT_PATTERN); } /** * 转换为 DEFAULT_DATE_TIME_FORMAT_PATTERN (yyyy-MM-dd HH:mm:ss) 格式字符串 * * @return yyyy-MM-dd HH:mm:ss 格式字符串 */ public String toDateTimeString() { return toDateTimeString(DateTime.DEFAULT_DATE_TIME_FORMAT_PATTERN); } /** * 使用日期转换pattern

pattern的用法参见java.text.SimpleDateFormat

* * @param pattern 日期解析规则 * @return 按规则转换后的日期时间字符串 */ public String toDateTimeString(String pattern) { SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateInstance(); fmt.applyPattern(pattern); return fmt.format(c.getTime()); } /** * 获取DateTime所表示时间的某个度量的值 * * @param field int 取值为:
DateTime.YEAR_FIELD -- 返回年份
* DateTime.MONTH_FIELD -- 返回月份,一月份返回1,二月份返回2,依次类推
DateTime.DAY_FIELD -- * 返回当前的天(本月中的)
DateTime.HOUR_FIELD -- 返回小时数(本天中的),24小时制
* DateTime.MINUTE_FIELD -- 返回分钟数(本小时中的)
DateTime.SECOND_FIELD -- * 返回秒数(本分钟中的)
DateTime.MILLISECOND_FIELD -- 返回毫秒数(本秒中的) * @return int field对应的值 */ public int get(int field) { //月份需要+1(月份从0开始) if (DateTime.MONTH_FIELD == field) { return c.get(field) + 1; } else { return c.get(field); } } /** * 返回自 1970-1-1 0:0:0 至此时间的毫秒数 * * @return long 毫秒数 */ public long getTimeInMillis() { return c.getTimeInMillis(); } /** * 设置field字段的值 * * @param field int 取值为:
DateTime.YEAR_FIELD -- 年份
* DateTime.MONTH_FIELD -- 月份,一月份从1开始
DateTime.DAY_FIELD -- * 当前的天(本月中的)
DateTime.HOUR_FIELD -- 小时数(本天中的),24小时制
* DateTime.MINUTE_FIELD -- 分钟数(本小时中的)
DateTime.SECOND_FIELD -- * 秒数(本分钟中的)
DateTime.MILLISECOND_FIELD -- 毫秒数(本秒中的) * @param value */ public void set(int field, int value) { //月份需要-1(月份从0开始) if (DateTime.MONTH_FIELD == field) { c.set(field, value - 1); } else { c.set(field, value); } } /** * 设置DateTime日期的年/月/日 * * @param year 年 * @param month 月 * @param day 日 */ public void set(int year, int month, int day) { set(DateTime.YEAR_FIELD, year); set(DateTime.MONTH_FIELD, month); set(DateTime.DAY_FIELD, day); } /** * 设置DateTime日期的年/月/日/小时 * * @param year 年 * @param month 月 * @param day 日 * @param hour 小时 */ public void set(int year, int month, int day, int hour) { set(year, month, day); set(DateTime.HOUR_FIELD, hour); } /** * 设置DateTime日期的年/月/日/小时/分钟 * * @param year 年 * @param month 月 * @param day 日 * @param hour 小时 * @param minute 分钟 */ public void set(int year, int month, int day, int hour, int minute) { set(year, month, day, hour); set(DateTime.MINUTE_FIELD, minute); } /** * 设置DateTime日期的年/月/日/小时/分钟/秒 * * @param year 年 * @param month 月 * @param day 日 * @param hour 小时 * @param minute 分钟 * @param second 秒 */ public void set(int year, int month, int day, int hour, int minute, int second) { set(year, month, day, hour, minute); set(DateTime.SECOND_FIELD, second); } /** * 设置DateTime日期的年/月/日/小时/分钟/秒/毫秒 * * @param year 年 * @param month 月 * @param day 日 * @param hour 小时 * @param minute 分钟 * @param second 秒 * @param milliSecond 毫秒 */ public void set(int year, int month, int day, int hour, int minute, int second, int milliSecond) { set(year, month, day, hour, minute, second); set(DateTime.MILLISECOND_FIELD, milliSecond); } /** * 对field值进行相加

add() 的功能非常强大,add 可以对 DateTime 的字段进行计算。

* 如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。
* 或者调用DateTime.reduce(int,int)进行日期相减

* * @param field int 取值为:
DateTime.YEAR_FIELD -- 年份
* DateTime.MONTH_FIELD -- 月份,一月份从1开始
* DateTime.DAY_FIELD -- 当前的天(本月中的)
* DateTime.HOUR_FIELD -- 小时数(本天中的),24小时制
* DateTime.MINUTE_FIELD -- 分钟数(本小时中的)
* DateTime.SECOND_FIELD -- 秒数(本分钟中的)
* DateTime.MILLISECOND_FIELD -- 毫秒数(本秒中的) * @param amount 数量(如果数量小于0则为相减) */ public void add(int field, int amount) { c.add(field, amount); } /** * 对field值进行相减

对add() 的功能进行封装,add 可以对 Calendar 的字段进行计算。

* 如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。
* 详细用法参见Calendar.add(int,int)

* * @param field int 取值为:
DateTime.YEAR_FIELD -- 年份
* DateTime.MONTH_FIELD -- 月份,一月份从1开始
* DateTime.DAY_FIELD -- 当前的天(本月中的)
* DateTime.HOUR_FIELD -- 小时数(本天中的),24小时制
* DateTime.MINUTE_FIELD -- 分钟数(本小时中的)
* DateTime.SECOND_FIELD -- 秒数(本分钟中的)
* DateTime.MILLISECOND_FIELD -- 毫秒数(本秒中的) * @param amount 数量(如果数量小于0则为相加) */ public void reduce(int field, int amount) { c.add(field, -amount); } /** * 判断此 DateTime 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。

此方法等效于:compareTo(when) * > 0

当且仅当 when 是一个 DateTime 实例时才返回 true。否则该方法返回 false。 * * @param when 要比较的 Object * @return 如果此 DateTime 的时间在 when 表示的时间之后,则返回 true;否则返回 false。 */ public boolean after(Object when) { if (when instanceof DateTime) { return c.after(((DateTime) when).c); } return c.after(when); } /** * 判断此 DateTime 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。

此方法等效于:compareTo(when) * < 0

当且仅当 when 是一个 DateTime 实例时才返回 true。否则该方法返回 false。

* * @param when 要比较的 Object * @return 如果此 Calendar 的时间在 when 表示的时间之前,则返回 true;否则返回 false。 */ public boolean before(Object when) { if (when instanceof DateTime) { return c.before(((DateTime) when).c); } return c.before(when); } /** * 创建并返回此对象的一个副本 * * @return 日期时间对象 */ @Override public Object clone() { return new DateTime((Calendar) c.clone()); } /** * 返回该此日历的哈希码 * * @return 此对象的哈希码值。 * @see Object */ @Override public int hashCode() { return c.hashCode(); } /** * 将此 DateTime 与指定 Object 比较。 * * @param obj - 要与之比较的对象。 * @return 如果此对象等于 obj,则返回 true;否则返回 false。 * @see Object */ @Override public boolean equals(Object obj) { if (obj instanceof DateTime) { return c.equals(((DateTime) obj).toCalendar()); } if (obj instanceof Calendar) { return c.equals(obj); } if (obj instanceof java.util.Date) { return c.getTime().equals(obj); } return false; } }

接下来再来看看如何使用:

 

获取当前系统时间:DateTime.now(); 返回的是一个DateTime对象。

一个DateTime对象可以转换成我们需要的各种日期格式,

例如:java.util.date 

  1. DateTime.now().toDate();  

大家可能也觉得这个写法还没有直接new Date();来得快对不对。

那么有很多情况是一个字符串,需要转换成java.util.Date对象,我们该怎么做呢?

  1. new DateTime("2014-10-29").toDate();  

当然也可以是这样的

  1. new DateTime("2014-10-29 15:19:23").toDate();  

这里的只是基础用法,还有一些情况是将java.util.Date转换成字符串格式的

可能大家一般会用SimpleDateFormat,但是这个太费事了,我们看看简单的办法。

  1. new DateTime(new Date()).toDateString();  

返回的是 2014-10-29 这种格式的字符串

  1. new DateTime(new Date()).toDateTimeString();  

返回的是2014-10-29 15:23:23 这种格式的字符串

如果我们需要类似 2014年10月29日 或 2014年10月29日 15时23分34秒 这种格式的怎么办呢

  1. new DateTime(new Date()).toDateTimeString("yyyy年MM月dd日");  
  2. new DateTime(new Date()).toDateTimeString("yyyy年MM月dd日 hh时mm分ss秒");  

这样就可以了!

来自:http://blog.csdn.net/yakson/article/details/40586639

转载于:https://www.cnblogs.com/xingzc/p/6390126.html

你可能感兴趣的文章
观察者模式
查看>>
bundle update: env: ruby_executable_hooks: No such file or directory
查看>>
Linux重置mysql密码(转载)
查看>>
图片上传
查看>>
中间件与auth认证的那点儿所以然
查看>>
Scala
查看>>
Android 中LinearLayout控件属性
查看>>
面向对象之多态性
查看>>
树状数组
查看>>
【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)
查看>>
pyqt动画的使用
查看>>
pyqt 自定义信号
查看>>
多任务--进程 及 进程间通信
查看>>
多线程/多进程+QProgressBar实现进度条
查看>>
多任务(进程)案例----- 拷贝文件夹
查看>>
Kotlin的快速入门
查看>>
python 虚拟环境的 安装与 使用 和修改为豆瓣源
查看>>
js 快速入门
查看>>
Python 中的GIL
查看>>
如何解决ASCII 字符显示不出来的情况
查看>>