一个好的Java时间工具类DateTime
此类的灵感来源于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; /**
* 日期时间类
*
* <p>对Calendar的封装,以便于使用</p>
*
* @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";
/**
* 年
* <p>可以通过DateTime.now().get(DateTime.YEAR_FIELD)来获取当前时间的年</p>
*/
public static final int YEAR_FIELD = java.util.Calendar.YEAR;
/**
* 月
* <p>可以通过DateTime.now().get(DateTime.MONTH_FIELD)来获取当前时间的月</p>
*/
public static final int MONTH_FIELD = java.util.Calendar.MONTH;
/**
* 日
* <p>可以通过DateTime.now().get(DateTime.DAY_FIELD)来获取当前时间的日</p>
*/
public static final int DAY_FIELD = java.util.Calendar.DATE;
/**
* 小时 <p>可以通过DateTime.now().get(DateTime.HOUR_FIELD)来获取当前时间的小时</p>
*/
public static final int HOUR_FIELD = java.util.Calendar.HOUR_OF_DAY;
/**
* 分钟 <p>可以通过DateTime.now().get(DateTime.MINUTE_FIELD)来获取当前时间的分钟</p>
*/
public static final int MINUTE_FIELD = java.util.Calendar.MINUTE;
/**
* 秒
* <p>可以通过DateTime.now().get(DateTime.SECOND_FIELD)来获取当前时间的秒</p>
*/
public static final int SECOND_FIELD = java.util.Calendar.SECOND;
/**
* 毫秒 <p>可以通过DateTime.now().get(DateTime.MILLISECOND_FIELD)来获取当前时间的毫秒</p>
*/
public static final int MILLISECOND_FIELD = java.util.Calendar.MILLISECOND;
private java.util.Calendar c; //日历类 /**
* 获取一个DateTime,此DateTime尚未初始化,表示的时间是1970-1-1 00:00:00.000
* <p>要获取当前系统时间,请用DateTime.now();</p>
*/
public DateTime() {
c = Calendar.getInstance();
c.clear();
} /**
* 设置时间 <p>可以传入一个时间对象,将会被转换为DateTime类型</p>
*
* @param date 时间对象
*/
public DateTime(java.util.Date date) {
c = Calendar.getInstance();
c.setTime(date);
} /**
* 设置时间 <p>可以传入一个日历对象,将会被转换为DateTime类型</p>
*
* @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; <p>比如,new DateTime(1000)
* 则表示1970-1-1 00:00:01.000;<br> 用负数表示基础时间以前的时间</p>
*
* @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());
} /**
* 解析时间 <p>根据DateTime中的DEFAULT_TIME_FORMAT_PATTERN规则转换为hh:mm:ss或hh:mm格式</p>
*
* @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);
}
} /**
* 解析日期 <p>根据DateTime中的DEFAULT_DATE_FORMAT_PATTERN规则转换为yyyy-MM-dd格式</p>
*
* @param date 字符串格式日期
* @return DateTime 日期时间类
*/
public static DateTime parseDate(String date) throws java.text.ParseException {
return DateTime.parseDateTime(date, DateTime.DEFAULT_DATE_FORMAT_PATTERN);
} /**
* 解析日期时间 <p>根据DateTime中的DEFAULT_DATE_TIME_FORMAT_PATTERN规则转换为yyyy-MM-dd
* HH:mm:ss格式</p>
*
* @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分析字符串 <p>pattern的用法参见java.text.SimpleDateFormat</p>
*
* @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 <p>pattern的用法参见java.text.SimpleDateFormat</p>
*
* @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 取值为:<br> DateTime.YEAR_FIELD -- 返回年份<br>
* DateTime.MONTH_FIELD -- 返回月份,一月份返回1,二月份返回2,依次类推<br> DateTime.DAY_FIELD --
* 返回当前的天(本月中的)<br> DateTime.HOUR_FIELD -- 返回小时数(本天中的),24小时制<br>
* DateTime.MINUTE_FIELD -- 返回分钟数(本小时中的)<br> DateTime.SECOND_FIELD --
* 返回秒数(本分钟中的)<br> 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 取值为:<br> DateTime.YEAR_FIELD -- 年份<br>
* DateTime.MONTH_FIELD -- 月份,一月份从1开始<br> DateTime.DAY_FIELD --
* 当前的天(本月中的)<br> DateTime.HOUR_FIELD -- 小时数(本天中的),24小时制<br>
* DateTime.MINUTE_FIELD -- 分钟数(本小时中的)<br> DateTime.SECOND_FIELD --
* 秒数(本分钟中的)<br> 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值进行相加 <p>add() 的功能非常强大,add 可以对 DateTime 的字段进行计算。<br>
* 如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。<br>
* 或者调用DateTime.reduce(int,int)进行日期相减</p>
*
* @param field int 取值为:<br> DateTime.YEAR_FIELD -- 年份<br>
* DateTime.MONTH_FIELD -- 月份,一月份从1开始<br>
* DateTime.DAY_FIELD -- 当前的天(本月中的)<br>
* DateTime.HOUR_FIELD -- 小时数(本天中的),24小时制<br>
* DateTime.MINUTE_FIELD -- 分钟数(本小时中的)<br>
* DateTime.SECOND_FIELD -- 秒数(本分钟中的)<br>
* DateTime.MILLISECOND_FIELD -- 毫秒数(本秒中的)
* @param amount 数量(如果数量小于0则为相减)
*/
public void add(int field, int amount) {
c.add(field, amount);
} /**
* 对field值进行相减 <p>对add() 的功能进行封装,add 可以对 Calendar 的字段进行计算。<br>
* 如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。<br>
* 详细用法参见Calendar.add(int,int)</p>
*
* @param field int 取值为:<br> DateTime.YEAR_FIELD -- 年份<br>
* DateTime.MONTH_FIELD -- 月份,一月份从1开始<br>
* DateTime.DAY_FIELD -- 当前的天(本月中的)<br>
* DateTime.HOUR_FIELD -- 小时数(本天中的),24小时制<br>
* DateTime.MINUTE_FIELD -- 分钟数(本小时中的)<br>
* DateTime.SECOND_FIELD -- 秒数(本分钟中的)<br>
* DateTime.MILLISECOND_FIELD -- 毫秒数(本秒中的)
* @param amount 数量(如果数量小于0则为相加)
*/
public void reduce(int field, int amount) {
c.add(field, -amount);
} /**
* 判断此 DateTime 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。 <p>此方法等效于:compareTo(when)
* > 0<br> 当且仅当 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 表示的时间之前,返回判断结果。 <p>此方法等效于:compareTo(when)
* < 0<br> 当且仅当 when 是一个 DateTime 实例时才返回 true。否则该方法返回 false。</p>
*
* @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
- DateTime.now().toDate();
大家可能也觉得这个写法还没有直接new Date();来得快对不对。
那么有很多情况是一个字符串,需要转换成java.util.Date对象,我们该怎么做呢?
- new DateTime("2014-10-29").toDate();
当然也可以是这样的
- new DateTime("2014-10-29 15:19:23").toDate();
这里的只是基础用法,还有一些情况是将java.util.Date转换成字符串格式的
可能大家一般会用SimpleDateFormat,但是这个太费事了,我们看看简单的办法。
- new DateTime(new Date()).toDateString();
返回的是 2014-10-29 这种格式的字符串
- new DateTime(new Date()).toDateTimeString();
返回的是2014-10-29 15:23:23 这种格式的字符串
如果我们需要类似 2014年10月29日 或 2014年10月29日 15时23分34秒 这种格式的怎么办呢
- new DateTime(new Date()).toDateTimeString("yyyy年MM月dd日");
- new DateTime(new Date()).toDateTimeString("yyyy年MM月dd日 hh时mm分ss秒");
这样就可以了!
来自:http://blog.csdn.net/yakson/article/details/40586639
一个好的Java时间工具类DateTime的更多相关文章
- Java日期工具类,Java时间工具类,Java时间格式化
Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>&g ...
- 小记Java时间工具类
小记Java时间工具类 废话不多说,这里主要记录以下几个工具 两个时间只差(Data) 获取时间的格式 格式化时间 返回String 两个时间只差(String) 获取两个时间之间的日期.月份.年份 ...
- 超详细的Java时间工具类
package com.td.util; import java.sql.Timestamp; import java.text.ParseException; import java.text.Pa ...
- java时间工具类
在项目中,很多地方需要根据时间获取相应的数据,将时间格式化,或者时间比较等相关操作.一个良好的工具类不仅可以减少代码冗余,还能促进业务处理,加快进度. /** * @author: lxw * @Da ...
- 一个简单的Java文件工具类
package com.xyworkroom.ntko.util; import java.io.File; import java.io.FileInputStream; import java.i ...
- JAVA时间工具类,在维护的项目里的
package com.inspur.jobSchedule.util; import org.apache.commons.lang3.time.DateUtils; import org.apac ...
- Java 时间工具类
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 1.Calendar 转化 String ...
- java时间工具类,时间相互转换
/* * @author XueWeiWei * @date 2019/8/26 16:22 */ package com.nps.utils; import java.text.ParseExcep ...
- JAVA时间工具类用法
1.获得N天前的TIMESTAMP Calendar cl = Calendar.getInstance(); cl.add(Calendar.DAY_OF_YEAR, -7); Date date ...
随机推荐
- 如何用Qt Python创建简单的桌面条形码应用
Qt for Python可以快速跨平台的GUI应用.这篇文章分享下如何结合Dynamsoft Barcode Reader SDK来创建一个简单的读码应用. 安装Qt for Python 官方站点 ...
- 【BZOJ4455】小星星(动态规划,容斥)
[BZOJ4455]小星星(动态规划,容斥) 题面 BZOJ 洛谷 Uoj 题解 题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一 ...
- 洛谷P1273 有线电视网 【树上分组背包】
题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...
- Kerberos的黄金票据详解
0x01黄金票据的原理和条件 黄金票据是伪造票据授予票据(TGT),也被称为认证票据.如下图所示,与域控制器没有AS-REQ或AS-REP(步骤1和2)通信.由于黄金票据是伪造的TGT,它作为TGS- ...
- 框架----Django之Form组件
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一.小试牛刀 1.创建Form类 from d ...
- OpenCV(C++版)图像读取,创建,复制,保存,显示
http://blog.163.com/yuyang_tech/blog/static/21605008320132642254689/ 一个小例子: #include "stdafx.h& ...
- libevent学习笔记(参考libevent深度剖析)
最近自学libevent事件驱动库,参考的资料为libevent2.2版本以及张亮提供的<Libevent源码深度剖析>, 参考资料: http://blog.csdn.net/spark ...
- Qt ------ stylesheet 样式
1.所有的窗口组件都可以用 setStyleSheet() 设置样式 2.使用样式,显示效果可以不受平台影响,比如保证window 7 和 linux 显示效果是一样的 QVariant 如果 sty ...
- python使用pwd和grp操作unix用户及用户组
1.pwd模块 pwd模块提供了一个unix密码数据库即/etc/passwd的操作接口,这个数据库包含本地机器用户帐户信息 常用操作如下: pwd.getpwuid(uid):返回对应uid的示例信 ...
- swift4.0中http连接(据于xcode9.3 URLSession)
NSURLSession是NSURLConnection的替代者,在2013年苹果全球开发者大会上(WWDC2013)随iOS7一起发布的,是对NSURLConnection进行了重构优化后的新的网络 ...