时间Date、Calendar、LocalDate 、LocalTime、LocalDateTime、Instant

举报
小影 发表于 2022/04/01 10:10:22 2022/04/01
【摘要】 以上小编学习开发中使用&总结,如果对你有帮助就帮忙点个小赞(^人^),如有侵权联系小编!

Date

#获取当前时间
Date date = new Date(); #Thu Dec 30 11:59:02 CST 2021
 
#格式化当前时间1
Date date = new Date();
DateFormat df2 = DateFormat.getDateTimeInstance();
String format = df2.format(date);  #2021-12-30 12:00:05
 
#格式化时间2
Date date = new Date()
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String value = format.format(date); #2021-12-30 12:00:05


#获取时间戳的三种方式
long l = System.currentTimeMillis();
long timeInMillis = Calendar.getInstance().getTimeInMillis();
long time = new Date().getTime();

 date获取年月日的方法基本已经作废了就不演示了

Calendar


我们可以把Calendar看做是Date类的增强版,因为Calendar类提供了一组方法,允许将一个以毫秒为单位的时间转换成年、月、日、时、分、秒、星期等。我们可以把Calendar类看做是万年历,默认显示的是当时间,同时也可以查看其他时间。如下:(其实,Calendar底层也是通过new Date() 获取Date实例)

#获取当前时间
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar = Calendar.getInstance();
Date date2 = calendar.getTime();
String value= dateFormat.format(date2)
 
#获取年
int year = calendar.get(Calendar.YEAR); 
 
#获取月
int month = calendar.get(Calendar.MONTH)+1;       //月(从0开始,故要+1):11
 
#获取本月当前时间的日 月有28-31天
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); #方案1
int day = calendar.get(Calendar.DATE);#方案2
 
#获取本年当前的日 年有365-366天
int dayOfYear   = calendar.get(Calendar.DAY_OF_YEAR); 
 
#获取当前时间小时
int hourOfDay   = calendar.get(Calendar.HOUR_OF_DAY);  #时(24小时制)
int hour  = calendar.get(Calendar.HOUR);          #时(12小时制)
 
#获取当前时间 分
int minute = calendar.get(Calendar.MINUTE);      
 
#获取当前时间 秒
int second = calendar.get(Calendar.SECOND);
 
#获取当前时间毫秒
int millisecond = calendar.get(Calendar.MILLISECOND);
 
#获取星期几 先判断一周的第一天是不是星期天;如果是,则-1;
int dayOfWeek = calendar.getFirstDayOfWeek() == Calendar.SUNDAY ? calendar.get(Calendar.DAY_OF_WEEK) - 1 : calendar.get(Calendar.DAY_OF_WEEK);

LocalDate 只包含年月日

获取年月日 

#获取当前 年 月 日
LocalDate today = LocalDate.now(); #2021-12-30
 
//构造指定的年月日
LocalDate localDate = LocalDate.of(1998, 12, 10); #结果2019-09-10
 
#获取当前 年
LocalDate today = LocalDate.now(); 
int year = today.getYear();
 
#获取当前 月
LocalDate today = LocalDate.now();
Month month = today.getMonthValue();

查询 | 修改年份日期等

#获取当前日期是 本周的第几天
LocalDate today = LocalDate.now();
int value = today.getDayOfWeek().getValue();
 
#获取当前日期是本月的第几天
LocalDate today = LocalDate.now();
int value = today.getDayOfMonth();
 
#获取当前日期是本年的第几天
LocalDate today = LocalDate.now();
int value = today.getDayOfYear();
 
#修改该日期的年份
LocalDate today = LocalDate.now();
LocalDate localDate = today.withYear(1998);  #结果 1998-12-30
 
#修改当前的日期的月份
LocalDate today = LocalDate.now();
LocalDate localDate = today.withMonth(2); #结果 2021-02-28
 
#修改该日期当月的天数
LocalDate today = LocalDate.now();
LocalDate localDate = today.withDayOfMonth(12);

 判断比较

#判断是否是闰年
LocalDate today = LocalDate.now();
boolean leapYear = today.isLeapYear();
 
#判断该年是356还是366天
LocalDate today = LocalDate.now();
int value = today.lengthOfYear();
 
#当前月份有多少天
LocalDate today = LocalDate.now();
int value = today.lengthOfMonth();
 
#比较该日期月其他日期的大小,返回正数 ,那么当前的对象时间较晚(数字较大)
LocalDate today = LocalDate.now();
LocalDate today2 = LocalDate.now();
int value = today.compareTo(today2);
 
#比较该日期是否比参数日期早(true为早)
LocalDate today = LocalDate.now();
LocalDate today2 = LocalDate.now();
LocalDate localDate = today2.withMonth(4); #只能判断年月日,时分秒无法判断,所以这里修改了月份 4
boolean before = localDate.isBefore(today);
 
#比较该日期是否比参数日期晚(true为晚)
LocalDate today = LocalDate.now();
LocalDate today2 = LocalDate.now();
LocalDate localDate = today2.withMonth(4);
boolean before = localDate.isAfter(today); 
 
#比较两个日期是否相等
LocalDate today = LocalDate.now();
LocalDate today2 = LocalDate.now();
LocalDate localDate = today2.withMonth(4);
boolean before = localDate.isEqual(today);


在原有的年份上增加年份

#在该日期增加指定年数,也就是当前年份 +n 年
LocalDate today = LocalDate.now();
LocalDate localDate = today.plusYears(3);
 
#在该日期增加指定月份,也就是当前月+ n 月
LocalDate today = LocalDate.now();
LocalDate localDate = today.plusMonths(3);
 
#在该日期增加指定周数,也是n周后的日期
LocalDate today = LocalDate.now();
LocalDate localDate = today.plusWeeks(1);
 
#在该日期增加指定的天数,例如今天30号+1 就是31号
LocalDate today = LocalDate.now();
LocalDate localDate = today.plusDays(1);

在原有的年份上减少年份
#在该年份上减少年份, 例如2021年减1=2020
LocalDate today = LocalDate.now();
LocalDate localDate = today.minusYears(1);
 
#在该月份上减少月份, 例如12月减1=11月
LocalDate today = LocalDate.now();
LocalDate localDate = today.minusMonths(1);
 
#在该日期减少指定的周数, 例如今天8号减1=1号
LocalDate today = LocalDate.now();
LocalDate localDate = today.minusWeeks(1);
 
#在该日期减少指定天数,今天30号,减1=29号
LocalDate today = LocalDate.now();
LocalDate localDate = today.minusDays(1);

LocalTime 只包含日期

#获取当前时间
LocalTime time = LocalTime.now(); # 10:42:57.151
 
#格式化 当前时间
DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm:ss");
String format = df.format(now); # 11:49:52
 
#构造指定时间
LocalTime specificTime = LocalTime.of(12, 12, 12, 12); #结果 12:12:12.000000012
 
#时区指定(Asia/Shanghai,GMT+8)
LocalTime timeKolkata = LocalTime.now(ZoneId.of("GMT+8"));  #10:48:52.490 

LocalDateTime 包含日期和时间 *使用推荐*

#获取当前时间
LocalDateTime nowTime= LocalDateTime.now(); #2021-12-30T11:43:28.219
 
#当前时间格式化
LocalDateTime nowTime= LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");# 2021-12-30 11:44:32
 
#自定义时间 of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
LocalDateTime endTime = LocalDateTime.of(2021, 12, 30, 12, 10, 11,00);  #2021-12-30T12:10:11
 
#获取年份
LocalDateTime nowTime = LocalDateTime.now();
int year = nowTime.getYear();
 
#获取月份
LocalDateTime nowTime = LocalDateTime.now();
int monthValue = nowTime.getMonthValue();
 
#获取日
LocalDateTime nowTime = LocalDateTime.now();
int dayofMonth = nowTime.getDayOfMonth();
 
#时
LocalDateTime nowTime = LocalDateTime.now();
int hour = nowTime.getHour();
 
#分
LocalDateTime nowTime = LocalDateTime.now();
int minute = nowTime.getMinute();
 
#秒
LocalDateTime nowTime = LocalDateTime.now();
int second = nowTime.getSecond();
 
#星期几
LocalDateTime nowTime = LocalDateTime.now();
DayOfWeek dayofWeek = nowTime.getDayOfWeek();
 
#今天是今年的第几天
LocalDateTime nowTime = LocalDateTime.now();
int dayofYear = nowTime.getDayOfYear();

判断比较
#比较该日期是否比参数日期早(true为早)
boolean isBefore = nowTime.isBefore(endTime);、
 
#比较该日期是否比参数日期晚(true为晚)
 boolean isAfter = nowTime.isAfter(endTime);
 
 #比较两个日期是否相等(true为相等)
 boolean euqal =nowTime.equals(endTime);


 在原有的年份上减少年份
#在该年份上减少n年份, 例如2021年减1=2020
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime minusYears = nowTime.minusYears(1);
 
 
#在该月份上减少n月份, 例如12月减1=11月
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime minusMonths = nowTime.minusMonths(1);
 
#在该日期减少n的周数, 例如今天8号减1=1号
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime BeforeWeek = nowTime.minusWeeks(1);
 
#在该日期减少n天数, 例如今天30号,减1=29号
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime minusDays = nowTime.minusDays(1);
 
#在该日期减少n小时, 例如现在11点减1=10点
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime minusHours = nowTime.minusHours(1);
 
#该日期减少n分钟, 例如现在60分减1=59分
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime minusMinutes = nowTime.minusMinutes(1);
 
#该日期减少n秒钟,例如现在60秒减1=59秒
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime minusSeconds = nowTime.minusSeconds(1);
 
#灵活的减少 params1,指定增加的数;params2 指定要减少年,月,日还是时,分,秒
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime minusTime = nowTime.minus(3, ChronoUnit.MONTHS);

在原有的年份上增加年份
#在该日期增加指定年数,也就是当前年份 +n 年
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime plusYears = nowTime.plusYears(1);
 
#在该日期增加指定月份,也就是当前月+ n 月
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime plusMonths = nowTime.plusMonths(1);
 
#在该日期增加指定周数,也是n周后的日期
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime AfterWeek = nowTime.plusWeeks(1);
 
#在该日期增加指定的天数,例如今天30号+1 就是31号
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime plusDays = nowTime.plusDays(1);
 
#在该日期增加n小时, 例如现在10点加1=11点
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime plusHours = nowTime.plusHours(1);
 
#该日期增加n分钟, 例如现在59分加1=60分
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime plusMinutes = nowTime.plusMinutes(1);
 
#该日期增加n秒钟, 例如现在59秒加1=60秒
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime plusSeconds = nowTime.plusSeconds(1);
 
#灵活的增加 params1,指定增加的数;params2 指定要增加年,月,日还是时,分,秒
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime plusTime = nowTime.plus(3, ChronoUnit.MONTHS);

 Instant

#获取当前时间戳
Instant now = Instant.now(); #以ISO-8601输出   2021-12-30T03:23:33.167Z 时间少了八小时
Instant now = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));  #时间正常 不少八小时
 
#格式化当前时间
Instant now = Instant.now();
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault());
String format = dateFormat.format(now); #2021-12-30 11:54:24 没有少八小时
 
#获得当前时间戳并且增加n毫秒
Instant instant1 = Instant.now().plusMillis(3);
#获得当前时间戳并且减少n毫秒
Instant instant2 = Instant.now().minusMillis(3);
 
#比较该日期是否比参数日期晚(true为晚)
instant.isAfter(instant1);
 
#比较该日期是否比参数日期早(true为早)
instant.isBefore(instant1); 
 
#比较两个日期是否相等(true为相等)
instant.equals(instant1);
 
 
#获得当前时间戳并增加1小时 通过TimeUnit.HOURS.toMillis(1)将小时转换为毫秒,然后通过plusMillis增加
Instant instant3 = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(1));
 
#获取时间戳instant和instant3相差天数,返回long类型,如果小于1天,都算零天,大于等于1天,小于2天算一天
 instant.until(instant3, ChronoUnit.DAYS); 
 
#获取时间戳instant和instant3相差的小时数,返回long类型
instant.until(instant3, ChronoUnit.HOURS); 
 
#获取时间戳instant和instant3相差的毫秒数,返回long类型
 instant.until(instant3, ChronoUnit.MILLIS);

 实用案例

实体类中可以用这个注解在字段上
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date modifyDate;   

时间格式的区别:
2019-12-31 to yyyy-MM-dd: 2019-12-31
2019-12-31 to YYYY-MM-dd: 2020-12-31
 
y:year-of-era;正正经经的年,即元旦过后;
Y:week-based-year;只要本周跨年,那么这周就算入下一年;
就比如说今年(2019-2020) 12.31 这一周是跨年的一周,而 12.31 是周二,那使用 YYYY 的话会显示 2020,使用 yyyy 则会从 1.1 才开始算是 2020。

H

小时(24小时制)

HH:mm:ss --> 14:53:11

h

小时(12小时制)

HH:mm:ss --> 14:53:11

 jsp页面转换时间戳

<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
  
 <fmt:formatDate value="${time}" pattern="yyyy-MM-dd HH:mm:ss"/> 

 ajax返回时间格式转换
function renderTime(date) {
    var dateee = new Date(date).toJSON();
    return new Date(+new Date(dateee) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')
}

 获取昨天日期
   public static String getYesterdayStr() {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DATE, -1);
        SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return startSdf.format(c.getTime());
    }

 获取上周第一天
public static String getWeekStartDay() {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.DAY_OF_WEEK,2);
		c.add(Calendar.DATE, -7);
		SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-MM-dd  00:00:00");
		return startSdf.format(c.getTime());
	}


获取上周最后一天
	public static String getWeekEndDay() {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.DAY_OF_WEEK,2);
		c.add(Calendar.DATE, -1);
		SimpleDateFormat endSdf = new SimpleDateFormat("yyyy-MM-dd  23:59:59");
		return endSdf.format(c.getTime());
	}

获取上月第一天
public static String getMonthStartDay() {
		Calendar c = Calendar.getInstance();
		c.add(Calendar.MONTH, -1);
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.getActualMaximum(Calendar.DAY_OF_MONTH), 23, 59, 59);
		SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-MM-01  00:00:00");
		return startSdf.format(c.getTime());
	}

获取上月最后一天
	public static String getMonthEndDay() {
		Calendar c = Calendar.getInstance();
		c.add(Calendar.MONTH, -1);
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.getActualMaximum(Calendar.DAY_OF_MONTH), 23, 59, 59);
		SimpleDateFormat endSdf = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
		return endSdf.format(c.getTime());
	}


 常用时间转换工具类
public class DateUtils {
 
    /**
     * Date转LocalDate
     * @param date
     */
    public static LocalDate date2LocalDate(Date date) {
        if(null == date) {
            return null;
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }
    /**
     * LocalDateTime转毫秒时间戳
     * @param localDateTime LocalDateTime
     * @return 时间戳 1640828236888
     */
    public static Long localDateTimeToTimestamp(LocalDateTime localDateTime) {
        try {
            ZoneId zoneId = ZoneId.systemDefault();
            Instant instant = localDateTime.atZone(zoneId).toInstant();
            return instant.toEpochMilli();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    /**
     * 时间戳转LocalDateTime
     * @param timestamp 时间戳
     * @return LocalDateTime
     */
    public static LocalDateTime timestampToLocalDateTime(long timestamp) {
        try {
            Instant instant = Instant.ofEpochMilli(timestamp);
            ZoneId zone = ZoneId.systemDefault();
            return LocalDateTime.ofInstant(instant, zone);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    /**
     * Date转LocalDateTime
     * @param date Date
     * @return LocalDateTime
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        try {
            Instant instant = date.toInstant();
            ZoneId zoneId = ZoneId.systemDefault();
            return instant.atZone(zoneId).toLocalDateTime();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    /**
     * LocalDateTime转Date
     * @param localDateTime LocalDateTime
     * @return Date
     */
    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        try {
            ZoneId zoneId = ZoneId.systemDefault();
            ZonedDateTime zdt = localDateTime.atZone(zoneId);
            return Date.from(zdt.toInstant());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * String转Date
     * @param String dateStr
     * @return Date
     */
      public static Date stringToDate(String dateStr){
            DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                Date date = format1.parse(dateStr);
                return date
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return null;
      }  
}



oracle中时间转换
字符串转date
SELECT * from  WHERE TO_DATE('1994-06-07', 'yyyy-mm-dd')=字段名

date转字符串
SELECT * FROM   employees
WHERE  to_char(字段名,’yyyy-mm-dd’)=’2019-10-1’


中文年月日
查询员工表中的入职时间为1994年06月07日
Select * from employees where to_char(hire_date,'yyyy"年"mm"月"dd"日"') = '1994年06月07日'
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。