Java日期类:Date和Calendar的使用

时间:2022-09-11 22:11:42

总是使用这两个类,总是需要百度。还不如一次全部整理完。

一、介绍:

Date 类

  • Date 表示特定的瞬间,精确到毫秒。
  • 在 JDK 1.1 之前,类 Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 1.1 开始,应使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃(查阅自 API 文档)

Calendar 类

  • Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
  • 瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

简单说就是:java.util.Date 是个日期数据;java.util.Calendar 用于日期相关的计算;

二、使用:

2.1 如何实例化当前时间?

Date date = new Date();
Calendar calendar = Calendar.getInstance(); System.out.println(date.toString());
//输出:Thu Oct 18 13:46:43 CST 2018 System.out.println(calendar.toString());
//输出:java.util.GregorianCalendar[time=1539841603042,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=291,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=1,HOUR_OF_DAY=13,MINUTE=46,SECOND=43,MILLISECOND=42,ZONE_OFFSET=28800000,DST_OFFSET=0]

根据输出,我们也可以看出Date和Calendar的区别。

2.2 如何实例化特定时间?

 //注:mm:ss必须小写,否则无法转换。HH大小写无影响。
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date1 = null;
try {
date1 = df.parse("2017-08-07 11:11:11");
} catch (ParseException e) {
e.printStackTrace();
} Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
实例化时注意:
  • 建议从Date使用格式转换,然后赋值(setTime)给Calendar,不然直接设置Calendar用毫秒数(setTimeInMillis)太麻烦。(其实不知道怎么设置....)
  • 另外,实例化时的格式:yyyy-MM-dd hh:mm:ss。mm:ss必须小写,否则无法转换。HH大小写无影响。

2.3 Date和Calendar如何互相转化?

Date date1 = new Date();
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
Date date = calendar1.getTime();
Calendar类有两个方法:setTime和getTime。
  • setTime接收一个Date类型的参数;
  • getTime返回一个Date类型的结果;

主要是通过这个方式实现互相转换。Date类好像没有相关转换的方法

2.4 如何格式化时间?

DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String s = df.format(new Date());
使用DateFormat类,进行format。

2.5 如何对日期进行操作。即日期加减:年月日以及小时分秒等。

DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

Date date1 = new Date();
//输出:2018-10-18 02:18:27
System.out.println(df.format(date1)); Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
calendar1.add(Calendar.MONTH,1);
Date date = calendar1.getTime(); //输出:2018-11-18 02:18:27
System.out.println(df.format(date));
使用Calendar的add方法:下面是官方接口定义:
 
abstract void add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。
   
  • field表示时间量:可以为如下:

Calendar.ERA:表示无加减;

Calendar.YEAR:年

Calendar.MONTH:月

Calendar.DATE:日

Calendar.HOUR:小时

Calendar.MINUTE:分钟

Calendar.SECOND:秒

注意:Calendar中的所有常量都可以为参数,不一定局限于上面的。比如Calendar.HOUR_OF_DAY,Calendar.WEEK_OF_MONTH等。不管是什么,只要这个值和周相关就是周(月中的第几周,年中的第几周等),和日相关就是日(一年当中的第几天,一月当中的第几天,一周当中的第几天),和小时相关就是小时

  • amount:为整数表示当前时间的基础上加上对应的时间量;为负数表示当前时间的基础上减去对应的时间量。

2.6 其他常用方法

2.6.1 获取当天结束时间:59分59秒0毫秒

private Date getDayEnd() {
Calendar cal = new GregorianCalendar();
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}

2.6.2 日期工具类(DateUtils.java)

package com.dmall.virtual.domain.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; public class DateUtils { public static final String MMddHHmmss = "MM-dd HH:mm:ss";
public static final String yyyyMMddHHmmss = "yyyy-MM-dd HH:mm:ss";
public static final String yyyy_MM_dd = "yyyy-MM-dd";
public static final String yyyyMMdd = "yyyy.MM.dd";
public static final String HHmm = "HH:mm";
public static final String MM_dd = "MM-dd";
public static final String yyyy_MM_dd_other = "yyyy-MM-dd";
private static final Logger logger = LoggerFactory.getLogger(DateUtils.class); /**
* 根据基础时间(base),单位(unit),偏移量(differ)对时间进行偏移并返回偏移后的时间
* @param base
* @param forward
* @param unit
* @param differ
* @return
*/
public static Date shiftDate(Date base, boolean forward, DateUnit unit, int differ){
if(base == null){
return null;
}
if(differ <= 0){
return base;
} Calendar c = Calendar.getInstance();
c.setTime(base);
c.set(unit.getUnit(), c.get(unit.getUnit()) +(forward ? differ : -differ));
return c.getTime();
} public enum DateUnit{ YEAR(Calendar.YEAR),
MONTH(Calendar.MONTH),
WEEK(Calendar.MONTH),
DAY(Calendar.DAY_OF_YEAR),
HOUR(Calendar.HOUR_OF_DAY),
MINUE(Calendar.MINUTE),
SECOND(Calendar.SECOND); private int unit; private DateUnit(int unit){
this.unit = unit;
} public int getUnit() {
return unit;
} public void setUnit(int unit) {
this.unit = unit;
} } /**
* 日期格式化为字符串
* @param date
* @param format
* @return
*/
public static String formatDate(Date date, String format) {
if (date == null) {
return null;
}
try{
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}catch(Exception e){
logger.error("日期格式化失败,date={}", date,e);
return null;
}
} /**
* 字符串格式化为日期
* @param dateStr
* @param format
* @return
*/
public static Date parseDate(String dateStr, String format){
DateFormat formatter = new SimpleDateFormat(format);
if(StringUtils.isBlank(dateStr)){
return null;
} try {
return formatter.parse(dateStr.trim());
} catch (ParseException e) {
logger.warn("ParseException日期异常1,参数dateStr={},format={}",new Object[]{dateStr,format,e});
return null;
}catch (Exception e) {
logger.warn("ParseException日期异常2,参数dateStr={},format={}",new Object[]{dateStr,format,e});
return null;
}
} /**
* 获取当天指定时间(时-分-秒)的日期
* @param hours
* @return
*/
public static Date getSpecialHms(Date date, int hours, int minutes, int seconds) {
if(date == null){
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
cal.set(Calendar.SECOND, seconds);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
} /**
* 获取指定日期的小时
* @return
*/
public static int getCurrentHours(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.HOUR_OF_DAY);
} public static void main(String[] args) { }
}
三、结束:

li {list-style-type:decimal;}.wiz-editor-body ol.wiz-list-level2 > li {list-style-type:lower-latin;}.wiz-editor-body ol.wiz-list-level3 > li {list-style-type:lower-roman;}.wiz-editor-body li.wiz-list-align-style {list-style-position: inside; margin-left: -1em;}.wiz-editor-body blockquote {padding: 0 12px;}.wiz-editor-body blockquote > :first-child {margin-top:0;}.wiz-editor-body blockquote > :last-child {margin-bottom:0;}.wiz-editor-body img {border:0;max-width:100%;height:auto !important;margin:2px 0;}.wiz-editor-body table {border-collapse:collapse;border:1px solid #bbbbbb;}.wiz-editor-body td,.wiz-editor-body th {padding:4px 8px;border-collapse:collapse;border:1px solid #bbbbbb;min-height:28px;word-break:break-word;box-sizing: border-box;}.wiz-editor-body td > div:first-child {margin-top:0;}.wiz-editor-body td > div:last-child {margin-bottom:0;}.wiz-editor-body img.wiz-svg-image {box-shadow:1px 1px 4px #E8E8E8;}.wiz-hide {display:none !important;}
-->
span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }.cm-searching {background: #ffa; background: rgba(255, 255, 0, .4);}.cm-force-border { padding-right: .1px; }@media print { .CodeMirror div.CodeMirror-cursors {visibility: hidden;}}.cm-tab-wrap-hack:after { content: ""; }span.CodeMirror-selectedtext { background: none; }.CodeMirror-activeline-background, .CodeMirror-selected {transition: visibility 0ms 100ms;}.CodeMirror-blur .CodeMirror-activeline-background, .CodeMirror-blur .CodeMirror-selected {visibility:hidden;}.CodeMirror-blur .CodeMirror-matchingbracket {color:inherit !important;outline:none !important;text-decoration:none !important;}.CodeMirror-sizer {min-height:auto !important;}
-->

Java日期类:Date和Calendar的使用的更多相关文章

  1. java时间类Date、Calendar及用法

    对于时间类,这篇主要说明各种现实情况下如何取值,怎么定向取值,得到自己想要的时间参数.在java中时间类主要有Date.Calendar,暂时只介绍 java.util.*下的时间类,对于java.s ...

  2. Java 时间类 Date 和 Calendar

    在项目中获取一个yyyy-MM-dd HH:mm:ss格式的时间字符串 package org.htsg.kits; import java.text.SimpleDateFormat; import ...

  3. Java:日期类Date与Calendar

    Timestamp类型与日期类型之间的转化? Timestamp timestamp = Timestamp.valueOf("2017-03-17 07:00:00"); Dat ...

  4. Java常用类Date、Calendar、SimpleDateFormat详解

    Date类 java.util 包提供了 Date 类来封装当前的日期和时间,Date 类提供两个构造函数来实例化 Date 对象 第一个构造函数使用当前日期和时间来初始化对象   Date( ) 第 ...

  5. 日期类 Date

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  6. Java 日期时间 Date类型&comma;long类型&comma;String类型表现形式的转换

    Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型 java.util.Date dt = new Date(); ...

  7. Java 日期时间 Date类型&comma;long类型&comma;String类型表现形式的转换 &lpar;转&rpar;

    Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型java.util.Date dt = new Date();Sy ...

  8. 运算符重载&plus;日期类Date

    Hello,一只爱学习的鱼 大学学习C++运算符重载的时候,老师出了一道"运算符重载+类"的综合练习题,让我们来一起看看吧! 题目: 设计一个日期类Date,包括年.月.日等私有成 ...

  9. 日期类Date

    Java在日期类中封装了有关日期和时间的信息,用户可以通过调用相应的方法来获取系统时间或设置日期和时间.Date类中有很多方法在JDK1.0公布后已经过时了,在8.3中我们将介绍JDK1.0中新加的用 ...

随机推荐

  1. Autofac IContainer 测试

    using Autofac; using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  2. 【项目启动】 tomcat启动,项目无法启动,无法正常访问&sol;项目可以启动,报错:java&period;lang&period;ClassNotFoundException&colon; ContextLoaderListener

    使用maven搭建项目(这个错误和是不是使用maven搭建项目没有关系),然后部署到tomcat中运行. 出现问题1: tomcat跑起来了,但是启动时间很短,没有报错,项目不能正常访问 项目启动时间 ...

  3. ExtJs之Ext&period;util&period;TextMetrics

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  4. &lbrack;Android&rsqb;Handler的消息机制

    最经面试中,技术面试中有一个是Handler的消息机制,细细想想,我经常用到的Handler无非是在主线程(或者说Activity)新建一个Handler对象,另外一个Thread是异步加载数据,同时 ...

  5. 【设计模式 - 24】之访问者模式(Visitor)

    1      模式简介 访问者模式的定义: 访问者模式将数据结构与数据操作进行了分离,解决了稳定的数据结构和易变的数据操作的耦合问题. 访问者模式的优点: 1)        符合单一职责原则: 2) ...

  6. HDU 2614 Beat&lpar;DFS&rpar;

    题目链接 Problem Description Zty is a man that always full of enthusiasm. He wants to solve every kind o ...

  7. Android通过Apk插件调起微信支付

    App对接微信调起微信支付需要在微信平台注册,鉴别的标识就是App的包名,所以将申请的包名单独打包成一个Apk文件,则在其他的App调起此Apk的时候同样可以起到调用微信支付的功能.这样就实现了调起微 ...

  8. ReflectASM-invoke,高效率java反射机制原理

    前言:前段时间在设计公司基于netty的易用框架时,很多地方都用到了反射机制.反射的性能一直是大家有目共睹的诟病,相比于直接调用速度上差了很多.但是在很多地方,作为未知通用判断的时候,不得不调用反射类 ...

  9. 随机ID添加

    var http = require("http"); var fs = require("fs"); var server = http.createServ ...

  10. pytest 14 使用自定义标记mark

    标记失败用到的情况是,本身就知道这是失败的例子,所以,不用让他运行,直接跳过.或者是依赖于某个方法,某个方式失败的话,用例直接标记成失败. 标记失败有两种方法,一种是方法内部,一种是方法外部.内部用p ...