Java基础-时间日期[1]
java.util.Date
-
概述
Date类实际上是对long值的封装,long值表示当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。可从构造函数看出来:public Date() { this(System.currentTimeMillis()); } public Date(long date) { fastTime = date; } //仅仅剩下该方法,其余方法都需要使用Calendar替代 public void setTime(long time) { fastTime = time; cdate = null; }
-
常用方法及问题
new Date(2019,1,1)
是相对于1970年1月1号的时间,即3919年1月1号,非常容易出问题。已丢弃- Date对象保存的是UTC的时间戳,但是在调用toString ()方法是却会调用TimeZone.getDefaultRef()以显示当前时区的时间
new Date()
可以通过调用setTime()
,改变时间。线程不安全- 没有提供日期加减操作,比如时间加7天或一个月等,必须通过setTime()手动加上时间间隔的毫秒数
- 只提供简单的时间比较方法,
before()
,after()
,compareTo()
。实际上就是毫秒数的大小比价 toString()
输出结果不直观Fri Dec 27 10:14:50 CST
,需调用new SimpleDateFormat("YYYY-MM-dd HH:mm:ss")
格式化输出,而SimpleDateFormat里面由于需要维护Calendar对象,导致线程不安全。
自己封装的java相关可能使用的方法
/**
* @author froggengo@qq.com
* @date 2021/4/13 20:42.
* 主要时java.util.Date的封装。
* Date对象包含的唯一东西是从1970年1月1日00:00:00 UTC开始的“纪元”以来的毫秒数。
* DateFormat对象上设置时区,以显示相应时区日期和时间
*/
public class FgDateUtils {
public static final long MILLIS_PER_SECOND = 1000;
public static final long MILLIS_PER_MINUTE = 60 * MILLIS_PER_SECOND;
public static final long MILLIS_PER_HOUR = 60 * MILLIS_PER_MINUTE;
public static final long MILLIS_PER_DAY = 24 * MILLIS_PER_HOUR;
public static String YYYY = "yyyy";
public static String YYYY_MM = "yyyy-MM";
public static String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
public static String YYYY_MM_DD_HH_MM_SS_FFF = "yyyy-MM-dd HH:mm:ss.SSS";
public static String SLASH_YYYY_MM_DD_HH_MM_SS = "yyyy/MM/dd HH:mm:ss";
public static String SLASH_YYYY_MM_DD_HH_MM_SS_FFF = "yyyy/MM/dd HH:mm:ss.SSS";
/**
* 返回当前系统时间(秒)
*/
public static int getCurSec() {
return Math.toIntExact(getCurMills());
}
/**
* 返回当前系统时间(毫秒)
*/
public static long getCurMills() {
return System.currentTimeMillis();
}
/**
* 毫秒数转字符串,格式:yyyy-MM-dd HH:mm:ss
*/
public static String millsToDateTime(long mills) {
return dateTime(new Date(mills));
}
/**
* 秒数转字符串,格式:yyyy-MM-dd HH:mm:ss
*/
public static String secToDateTime(int sec) {
return dateTime(new Date(sec * MILLIS_PER_SECOND));
}
/**
* 将日期转yyyy-MM-dd格式
*/
public static String date(final Date date) {
return formatDateTime(date, YYYY_MM_DD);
}
/**
* 将日期转yyyy-MM-dd HH:mm:ss格式
*/
public static String dateTime(final Date date) {
return formatDateTime(date, YYYY_MM_DD_HH_MM_SS);
}
/**
* 将yyyy-MM-dd HH:mm:ss格式的字符串转日期
*/
public static Date parseDateTime(final String str) {
return parseToDate(str, YYYY_MM_DD_HH_MM_SS);
}
/**
* 根据字符串格式格式化日期
*/
public static String formatDateTime(final Date date, final String format) {
return new SimpleDateFormat(format).format(date);
}
/**
* 将字符串按给定格式解析为日期
*/
public static Date parseToDate(final String str, final String format) {
if (str == null) {
return null;
}
try {
return new SimpleDateFormat(format).parse(str);
} catch (ParseException e) {
return null;
}
}
/**
* 返回相对当前月份的偏移月数,所在月份第一天0点整日期,offset表示偏移量,如上个月为-1
*/
public static Date truncateMonByOffset(int offset) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH,offset);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return truncateDate(calendar);
}
/**
* 指定时间搓(毫秒)当月第一天的0点整
*/
public static Date truncateMon(long millsTime) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(millsTime);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return truncateDate(calendar);
}
/**
* 指定时间搓(毫秒)当天的0点整
*/
public static Date truncateDate(long millsTime) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(millsTime);
return truncateDate(calendar);
}
/**
* 返回相对今天的偏移天数,当天的0点日期
*/
public static Date truncateDateByOffset(int offset) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.DAY_OF_MONTH, offset);
return truncateDate(calendar);
}
/**
* 更好的是apache DateUtils 的实现
*/
public static Date truncateDate(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return truncateDate(calendar);
}
/**
* 更好的是apache DateUtils 的实现
*/
public static Date truncateDate(Calendar calendar) {
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
}