在编写薪水支付系统时有判断日期的需求,因此对java中涉及到日期的相关类进行总结。
java.util.Date
其中大多数方法已废弃,由Caledar以及DateFormat代替。
java.util.Caledar
实现日期与时间字段之间的转化
java.text.DateFormate
格式化、解析日期字符串
表示形式
年:y-1900
月:0-11表示,0表示1月
日:1-31表示
时:0-23表示
分:0-59表示
秒:0-61表示;(60、61涉及闰秒时表示)
日期工具类
package implement.util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 日期工具类
* 1.
* Created by ZD on 2017/11/28.
*/
public class DatesUtil {
//默认日期格式
public static final String DATE_DEFAULT_FORMAT = "yyyy-MM-dd";
//默认日期时间格式
public static final String DATETIME_DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
//默认时间格式
public static final String TIME_DEFAULT_FORMAT = "HH:mm:ss";
//日期格式化
private static DateFormat dateFormat = null;
//日期时间格式化
private static DateFormat datetimeFormat = null;
//时间格式化
private static DateFormat timeFormat = null;
private static Calendar calendar = null;
/**
* 初始化
*/
static{
dateFormat = new SimpleDateFormat(DATE_DEFAULT_FORMAT);
datetimeFormat = new SimpleDateFormat(DATETIME_DEFAULT_FORMAT);
timeFormat = new SimpleDateFormat(TIME_DEFAULT_FORMAT);
calendar = new GregorianCalendar();
}
/**
* 日期格式化 yyyy-MM-dd
* @param date
* @return
*/
public static String getDateFormat(Date date){
return dateFormat.format(date);
}
/**
* 日期时间格式化 yyyy-MM-dd HH:mm:ss
* @param date
* @return
*/
public static String getDateTimeFormat(Date date){
return datetimeFormat.format(date);
}
/**
* 时间格式化 HH:mm:ss
* @param date
* @return
*/
public static String getTimeFormat(Date date){
return timeFormat.format(date);
}
/**
* 日期格式化
* @param date
* @return
*/
public static Date getDateFormat(String date){
try {
return dateFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 日期时间格式化
* @param date
* @return
*/
public static Date getDateTimeFormat(String date){
try {
return datetimeFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 时间格式化
* @param date
* @return
*/
public static Date getTimeFormat(String date){
try {
return timeFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取当前日期
* @return
*/
public static Date getDate(){
return DatesUtil.getDateFormat(dateFormat.format(new Date()));
}
/**
* 获取当前日期星期一日期
* @return
*/
public static Date getFirstDayOfWeek(){
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.set(Calendar.DAY_OF_WEEK,calendar.getFirstDayOfWeek());
return calendar.getTime();
}
/**
* 获取当前日期星期日日期
* @return
*/
public static Date getLastDayOfWeek(){
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.set(Calendar.DAY_OF_WEEK,calendar.getFirstDayOfWeek()+6);
return calendar.getTime();
}
/**
* 获取指定日期中的星期一日期
* @param date
* @return
*/
public static Date getFirstDayOfWeek(Date date){
if (date == null)
return null;
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_WEEK,calendar.getFirstDayOfWeek());
return calendar.getTime();
}
/**
* 获取给定日期所在星期的星期日日期
* @param date
* @return
*/
public static Date getLastDayOfWeek(Date date){
if (date == null)
return null;
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_WEEK,calendar.getFirstDayOfWeek()+6);
return calendar.getTime();
}
/**
* 获取当前月第一天日期
* @return
*/
public static Date getFirstDayOfMonth(){
calendar.set(Calendar.DAY_OF_MONTH,1);
return calendar.getTime();
}
/**
* 获取当前月的最后一天
* @return
*/
public static Date getLastDayOfMonth(){
calendar.set(Calendar.DAY_OF_MONTH,1);
calendar.add(Calendar.MONTH,1);
calendar.add(Calendar.DAY_OF_MONTH,-1);
return calendar.getTime();
}
/**
* 获取指定月的第一天
* @param date
* @return
*/
public static Date getFirstDayOfMonth(Date date){
if (date == null)
return null;
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH,1);
return calendar.getTime();
}
/**
* 返回指定日期所在月的最后一天
* @param date
* @return
*/
public static Date getLastDayOfMonth(Date date){
if (date == null)
return null;
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH,1);
calendar.add(Calendar.MONTH,1);
calendar.add(Calendar.DAY_OF_MONTH,-1);
return calendar.getTime();
}
/**
* 获取日期前一天
* @param date
* @return
*/
public static Date getForwardDay(Date date){
if (date == null)
return null;
calendar.setTime(date);
calendar.add(Calendar.DATE,-1);
return calendar.getTime();
}
/**
* 获取日期后一天
* @param date
* @return
*/
public static Date getNextDay(Date date){
if (date == null)
return null;
calendar.setTime(date);
calendar.add(Calendar.DATE,1);
return calendar.getTime();
}
/**
* 获取当前年份
* @return
*/
public static int getNowYear(){
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.YEAR);
}
/**
* 获取当前月份
* @return
*/
public static int getNowMonth(){
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.MONTH)+1;
}
/**
* 获取当前日期
* @return
*/
public static int getNowDay(){
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.DATE);
}
/**
* 获取当前星期
* @return
*/
public static String getNowWeek(){
Calendar calendar = Calendar.getInstance();
int week = calendar.get(Calendar.DAY_OF_WEEK);
return "星期"+(week-1);
}
/**
* 获取当月天数
* @return
*/
public static int getMonthDay(){
Calendar calendar = Calendar.getInstance();
return calendar.getActualMaximum(Calendar.DATE);
}
/**
* 获取指定月天数
* @param date
* @return
*/
public static int getMonthDay(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.getActualMaximum(Calendar.DATE);
}
/**
* 获取时间段中的每一天
* @param startDate
* @param endDate
* @return
*/
public static List<Date> getEveryDayInDate(Date startDate, Date endDate){
if (startDate == null || endDate == null)
return null;
List<Date> dates = new ArrayList<Date>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
dates.add(calendar.getTime());
while (calendar.getTime().compareTo(endDate) < 0){
calendar.add(Calendar.DAY_OF_MONTH,1);
dates.add(calendar.getTime());
}
return dates;
}
/**
* 判定指定日期是不是周末
* @param date
* @return
*/
public static boolean isWeekend(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int day = calendar.get(Calendar.DAY_OF_WEEK);
if (day == 7 || day == 1)
return true;
return false;
}
public static void main(String[] args){
System.out.println("日期格式化:"+DatesUtil.getDateFormat(new Date()));
System.out.println("日期时间格式化:"+DatesUtil.getDateTimeFormat(new Date()));
System.out.println("时间格式化:"+DatesUtil.getTimeFormat(new Date()));
System.out.println("获取当前日期:"+DatesUtil.getDate());
System.out.println("获取当前星期中星期一日期:"+DatesUtil.getFirstDayOfWeek());
System.out.println("获取当前星期中星期日日期:"+DatesUtil.getLastDayOfWeek());
System.out.println("获取指定日期所在星期的星期一日期:"+DatesUtil.getFirstDayOfWeek(DatesUtil.getDateFormat("2017-11-10")));
System.out.println("获取指定日期所在星期的星期日日期:"+DatesUtil.getLastDayOfWeek(DatesUtil.getDateFormat("2017-11-23")));
System.out.println("获取当前月中第一天日期:"+DatesUtil.getFirstDayOfMonth());
System.out.println("获取当前月中最后一天日期:"+DatesUtil.getLastDayOfMonth());
System.out.println("获取指定月的第一天日期:"+DatesUtil.getFirstDayOfMonth(DatesUtil.getDateFormat("2017-10-23")));
System.out.println("获取指定月的最后一天日期:"+DatesUtil.getLastDayOfMonth(DatesUtil.getDateFormat("2017-02-04")));
System.out.println("获取日期前一天:"+DatesUtil.getForwardDay(DatesUtil.getDateFormat("2017-03-12")));
System.out.println("获取日期后一天:"+DatesUtil.getNextDay(DatesUtil.getDateFormat("2017-05-14")));
System.out.println("获取当前年份:"+DatesUtil.getNowYear());
System.out.println("获取当前月份:"+DatesUtil.getNowMonth());
System.out.println("获取当前日期:"+DatesUtil.getNowDay());
System.out.println("获取当前星期:"+DatesUtil.getNowWeek());
System.out.println("获取当月天数:"+DatesUtil.getMonthDay());
System.out.println("获取指定月天数:"+DatesUtil.getMonthDay(DatesUtil.getDateFormat("2017-02-11")));
List<Date> dates = DatesUtil.getEveryDayInDate(DatesUtil.getDateFormat("2017-10-11"),DatesUtil.getDateFormat("2017-11-01"));
for (Date date:dates){
System.out.println("获取时间段的每一天:"+DatesUtil.getDateFormat(date));
}
System.out.println("判断某天是不是周末:"+DatesUtil.isWeekend(DatesUtil.getDateFormat("2017-11-27")));
}
}
TimeStamp相关
package implement.util;
import java.sql.Timestamp;
/**
* 与Date有关的瘦包装器,允许将JDBC API将该类标识为sql timestamp值。
*
* Created by ZD on 2017/11/27.
*/
public class TimeStampDesc {
public static void main(String[] args){
/**
* new Timestamp(long time)
* 使用毫秒数值来构造Timestamp对象
*/
Timestamp timestamp = new Timestamp(1511792658089L);
Timestamp timestamp1 = new Timestamp(1511792658090L);
/**
* after(Timestamp ts)
* before(Timestamp ts)
* 判定此timestamp对象是否晚于/早于指定的timestamp对象
*/
System.out.println("after():"+timestamp.after(timestamp1));
System.out.println("bofore():"+timestamp.before(timestamp1));
/**
* compareTo(Timestamp ts)
* 将此timestamp对象与给定timestamp对象进行比较
*/
int compareTo = timestamp.compareTo(timestamp1);
System.out.println("compareTo()"+compareTo);
/**
* getTime()
* 返回自1970年1月1日00:00:00GMT以来的毫秒数
*/
System.out.println("getNanos:"+timestamp1.getNanos());
System.out.println("getTime:"+timestamp1.getTime());
}
}
Date相关
package implement.util;
import java.util.*;
/**
* Calendar类功能描述
*
* Created by ZD on 2017/11/22.
*/
public class CalendarDesc {
public static void main(String[] args){
GregorianCalendar gregorianCalendar = new GregorianCalendar();
/**
* add(int field,int amout)
* 为给定日历添加或减去指定的时间量
*/
System.out.println("before add Calendar.MONTH:"+gregorianCalendar.get(Calendar.MONTH));
// gregorianCalendar.add(Calendar.MONTH,-5);
// System.out.println("after add Calendar.MONTH:"+gregorianCalendar.get(Calendar.MONTH));
/**
* roll(int field,boolean up)
* 在给定时间字段上添加或减去单个时间单元,
*/
gregorianCalendar.roll(Calendar.MONTH,true);
System.out.println("after roll up Calendar.Month:"+gregorianCalendar.get(Calendar.MONTH));
gregorianCalendar.roll(Calendar.MONTH,false);
System.out.println("after roll down Calendar.Month:"+gregorianCalendar.get(Calendar.MONTH));
/**
* roll(int field,int amount)
* 指定日历字段添加指定数量的值
*/
System.out.println("before roll Calendar.Year:"+gregorianCalendar.get(Calendar.YEAR));
// gregorianCalendar.roll(Calendar.YEAR,3);
// System.out.println("after roll Calendar.Year:"+gregorianCalendar.get(Calendar.YEAR));
/**
* 获得时区
*/
System.out.println("get timezone:"+gregorianCalendar.getTimeZone());
/**
* 判断日期时间解释是否宽松
* 如果宽松,类似可将32解释成下个月1号
* 如果不宽松,上序情况会报异常
*/
System.out.println("is lenient"+gregorianCalendar.isLenient());
/**
*setLenient(boolean lenient)设置是否宽松
*/
gregorianCalendar.setLenient(true);
/**
* setFirstDayOfWeek(int value)
* getFirstDayOfWeek()
* 设置/获取一星期的第一天是哪一天
*/
System.out.println("before setFirstDayOfWeek:"+gregorianCalendar.getFirstDayOfWeek());
// gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
// System.out.println("after setFirstDayOfWeek:"+gregorianCalendar.getFirstDayOfWeek());
/**
* getMinimalDaysInFirstWeek()
* setMinimalDaysInFirstWeek(int value)
* 设置/获取一年中第一个星期所需最少天数
*/
System.out.println("before setMinimalDaysInFirstWeek:"+gregorianCalendar.getMinimalDaysInFirstWeek());
// gregorianCalendar.setMinimalDaysInFirstWeek(7);
// System.out.println("after setMinimalDaysInFirstWeek:"+gregorianCalendar.getMinimalDaysInFirstWeek());
/**
* getMinmum(int field)
* 返回Calendar实例给定日历字段的最小值
*/
System.out.println("getMinimum:"+gregorianCalendar.getMinimum(Calendar.YEAR));
/**
* getMaximum(int field)
* 返回Calendar实例给定日历字段的最大值
*/
System.out.println("getMaximum:"+gregorianCalendar.getMaximum(Calendar.DATE));
/**
* getGreatestMinimum(int field)
* 返回Calendar实例给定日历字段的最高的最小值
*/
System.out.println("getGreatestMinimum:"+gregorianCalendar.getGreatestMinimum(Calendar.DATE));
/**
* getLeastMaximum(int field)
* 返回Calendar实例给定日历字段的最低的最大值
*/
System.out.println("getLeastMaximum:"+gregorianCalendar.getLeastMaximum(Calendar.DATE));
/**
* getActualMinimum(int field)
* getActualMaximum(int field)
* 返回指定日历字段可能拥有的最小/大值
*/
System.out.println("getActualMinimum:"+gregorianCalendar.getActualMinimum(Calendar.MONTH));
System.out.println("getActualMaximum:"+gregorianCalendar.getActualMaximum(Calendar.DATE));
/**
* after(Object when)
* before(Object when)
* 根据Calendar白搜狐IDE时间是否在指定Object表示的时间之后/之前
*/
GregorianCalendar gregorianCalendar1 = new GregorianCalendar(2017,11,23);
System.out.println("after():"+gregorianCalendar.after(gregorianCalendar1));
System.out.println("before():"+gregorianCalendar.before(gregorianCalendar1));
/**
* clear()
* clear(int field)
* 将日历字段值或时间值全/某一字段设置为未定义
*/
// gregorianCalendar.clear(Calendar.YEAR);
// gregorianCalendar.clear();
// System.out.println("clear()"+gregorianCalendar.get(Calendar.YEAR));
// System.out.println("clear(int field)"+gregorianCalendar.get(Calendar.YEAR));
/**
* getTime()
* getTimeInMills()
* 返回date对象
*/
System.out.println("getTime():"+gregorianCalendar.getTime());
System.out.println("getTimeInMills():"+gregorianCalendar.getTimeInMillis());
/**
* isLeapYear(int year)
* 判断给定年份是否为闰年
*/
System.out.println("isLeapYear():"+gregorianCalendar.isLeapYear(gregorianCalendar.get(Calendar.YEAR)));
}
}
DateFormat相关
package implement.util;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import static java.text.DateFormat.*;
import static java.text.DateFormat.FULL;
import static java.text.DateFormat.LONG;
/**
* Created by ZD on 2017/11/22.
*/
public class DateFormatDesc {
/**
* 测试
* @param args
*/
public static void main(String[] args){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
Date date = new Date(2017-1900,11-1,26);
/**
* format(Date date)
* 将一个Date格式化为日期/时间字符串
*/
String dates = simpleDateFormat.format(date);
System.out.println("format():"+date);
/**
*format(Date date,StringBuffer toAppendTo,FiledPosotion fieldPostion)
* 将一个Date格式化为日期/时间字符串,输出到字符缓冲区
*/
/*SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
StringBuffer stringBuffer = simpleDateFormat.format(new Date(2017,11,30),new StringBuffer(), null);*/
/**
* getAvailableLocals()
* 返回所有语言环境的数组
*/
Locale[] locales = DateFormat.getAvailableLocales();
for (Locale locale:locales){
System.out.print("local:"+locale.getCountry()+",");
}
System.out.println();
/**
* getCalendar(),获取与此日期/时间格式关联的日历
*/
Calendar calendar = simpleDateFormat.getCalendar();
System.out.println("calendar:"+calendar.getTime());
/**
* getDateInstance()
* 获取日期格式器,默认语言环境的默认格式风格
*/
DateFormat dateFormat1 = DateFormat.getDateInstance();
String format1 = dateFormat1.format(date);
System.out.println("默认格式风格:"+format1);
/**
* getDateInstance(int dateStyle),给定格式风格
*/
DateFormat dateFormat2 = DateFormat.getDateInstance(SHORT);
String format2 = dateFormat2.format(date);
System.out.println("设置为short风格:"+format2);
DateFormat dateFormat3 = DateFormat.getDateInstance(MEDIUM);
String format3 = dateFormat3.format(date);
System.out.println("设置为MEDIUM风格:"+format3);
DateFormat dateFormat4 = DateFormat.getDateInstance(LONG);
String format4 = dateFormat4.format(date);
System.out.println("设置为LONG风格:"+format4);
DateFormat dateFormat5 = DateFormat.getDateInstance(FULL);
String format5 = dateFormat5.format(date);
System.out.println("设置为FULL风格:"+format5);
/**
* getDateInstance(int dateStyle,Locale locale)
* 给定语言,给定风格,格式化日期
*/
DateFormat dateFormat6 = DateFormat.getDateInstance(FULL,Locale.ENGLISH);
String format6 = dateFormat6.format(date);
System.out.println("设置为FULL风格,语言环境为English:"+format6);
/**
* getDateTimeInstance()
* 在默认语言、默认风格,格式化日期时间
*/
DateFormat dateFormat7 = DateFormat.getDateTimeInstance();
String format7 = dateFormat7.format(new Date());
System.out.println("默认语言、默认风格下的日期时间格式器:"+format7);
/**
* getDateTimeInstance(int dateStyle,int timeStyle)
* 给定日期风格、时间风格下的日期时间格式器
* dateStyle、timeStyle下各有四种风格
*/
DateFormat dateFormat8 = DateFormat.getDateTimeInstance(LONG,SHORT);
String format8 = dateFormat8.format(new Date());
System.out.println("给定日期风格,时间风格下的日期时间格式器:"+format8);
/**
* getDateTimeInstance(int dateStyle,int timeStyle,Locale locale)
* 给定日期风格、时间风格、所处语言环境下的日期时间格式器
*/
DateFormat dateFormat9 = DateFormat.getDateTimeInstance(FULL,LONG,Locale.ENGLISH);
String format9 = dateFormat9.format(new Date());
System.out.println("给定日期风格,时间风格以及所处语言环境下的日期时间格式器:"+format9);
/**
*setCalendar()设置日历
* getCalendar()获取日历
* 使用的默认语言环境下默认日历
*/
simpleDateFormat.setCalendar(new GregorianCalendar());
Calendar calendar1 = simpleDateFormat.getCalendar();
System.out.println("获取日历:"+calendar1.getTime());
/**
* setNumberFormat(),NumberFormat数值格式
* getNumberFormat()
*/
simpleDateFormat.setNumberFormat(new DecimalFormat());
NumberFormat numberFormat = simpleDateFormat.getNumberFormat();
long number = 20171126;
System.out.println("获取numberFormat:"+numberFormat.format(number));
/**
* getTimeZone()设定时区
*/
TimeZone timeZone = simpleDateFormat.getTimeZone();
System.out.println("timeZone:"+timeZone.getDisplayName());
/**
* isLenient()判断日期/时间解析是否严格
*/
boolean islenient = simpleDateFormat.isLenient();
System.out.println("解析是否严格:"+islenient);
}
}