Java提供了Date类来操作日期和时间,Date类也封装在java.util包中。
我们使用Date类时,需要先创建Date对象,Date类提供了两个构造函数来实例化Date对象:
编号构造方法说明功能描述1Date()使用当前日期和时间初始化对象分配Date对象并初始化此对象,使用当前日期和时间来初始化对象,精准到毫秒。2Date(long date)使用标准基准时间初始化对象分配Date对象并初始化此对象,表示从标准基准时间1970年1月1日起的毫秒数。下面我们使用Date类的两种构造方法来创建Date对象
⚠️注意:由于Date类创建对象的时间是变化的,所以每次运行程序在控制台输出的结果都不一样。
从程序中直接输出Date对象,显示的格式是:“Thu Oct 22 14:51:10 CST 2020”,但是很多时候我们让日期以我们想要的格式输出,比如“2010-11-01”,“14:20:25”。这时候我们就需要用到java.text包中的DateFormat类了。
DateFormat类是一个日期的格式化类,用来格式化日期。DateFormat类是定义在java.test包中的。
DateFormat类的功能是按照指定格式对日期或者时间进行格式化,DateFormat类提供了4种默认的格式化风格,即SHORT、MEDIUM、LONG、FULL,其中:
SHORT:完全为数字,如01.13.2020或3:30pm;MEDIUM:较长,如Jan,01,2020;LONG::长,如Janurary 01,2020或3:30:52pm;FULL:完全指定,如Tuesday、Aril12、2020 AD或14:51:10 CST;除此之外,使用DateFormat类还可以自定义日期、时间的格式。要定义日期、时间的格式,首先要创建DateFormat类对象,DateFormat类是抽象对象,因此需要使用DateFormat的静态方法getDateInstance()创建DateFormat对象:
DateFormat df = DateFormat.getDateInstance();DateFormat是一个抽象类,按照以住的思路,直接使用其子类实例化即可。但是DateFormat 类本身的内部提供了可以直接为其实例化的操作。
//得到日期的DateFormat对象: public static final DateFormat getDateInstance(); //得到日期时间的DateFormat对象: public static final DateFormat getDateTimeInstance(); //使用DateFormat类格式化Date类日期 public final String format(Date date)SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。
比如:
import java.util.*; import java.text.*; public class SimpleDateFormatDemo1 { public static void main(String[] args) { // TODO Auto-generated method stub Date dateNow = new Date( ); SimpleDateFormat sft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss"); System.out.println("当前时间为: " + sft.format(dateNow)); } } Console: 当前时间为: 2020-10-22 03:35:26代码:SimpleDateFormat sft = **new** SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");确定了转换的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒。
⚠️注意:有的格式大写,有的格式小写,例如 MM 是月份,mm 是分;HH 是 24 小时制,而 hh 是 12 小时制。
时间模式字符串用来指定时间格式。在日期和时间模式字符串中,未加引号的字母 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’ 被解释为模式字母,即所有所有的 ASCII 字母都被保留,用来表示日期或时间字符串元素。
字母描述表示示例G纪元标记TextADy四位年份Year2001M月份MonthJuly or 07d一个月的日期Number10hA.M./P.M. (1~12)格式小时Number12H一天中的小时 (0~23)Number22m分钟数Number30s秒数Number55S毫秒数Number234E星期几TextTuesdayD一年中的日子Number360F一个月中第几周的周几Number2 (second Wed. in July)w一年中第几周Number40W一个月中第几周Number1aA.M./P.M. 标记TextPMk一天中的小时(1~24)Number24KA.M./P.M. (0~11)格式小时Number10z时区General time zoneEastern Standard TimeZ时区RFC 822 time zone-0800’文字定界符Delimiter"单引号`printf 方法可以很轻松地格式化时间和日期。使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾。
转 换 符说 明示 例c包括全部日期和时间信息星期六 十月 27 14:21:20 CST 2007F"年-月-日"格式2007-10-27D"月/日/年"格式10/27/07r"HH:MM:SS PM"格式(12时制)02:25:51 下午T"HH:MM:SS"格式(24时制)14:28:16R"HH:MM"格式(24时制)14:281.DateFormat 可以直接使用,但其本身是一个抽象类,可以根据Locate指定的区域得到对应的日期时间格式
2.SimpleDateFormat 类是DateFormat 类的子类,一般情况下来讲 DateFormat 类很少会直接使用。而都使用SimpleDateFormat 类完成。
Java使用以下三种方法来比较两个日期:
getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。中式日期格式需要通过Locale对象指定要显示的区域,指定的区域是中国
import java.text.DateFormat ; import java.util.Date ; import java.util.Locale ; public class DateFormatDemo4 { public static void main(String[] args) { // TODO Auto-generated method stub DateFormat df1 = null ; DateFormat df2 = null ; df1 = DateFormat.getDateInstance(DateFormat.YEAR_FIELD,new Locale("zh","CN")) ; df2 = DateFormat.getDateTimeInstance(DateFormat.YEAR_FIELD,DateFormat.ERA_FIELD,new Locale("zh","CN")) ; System.out.println("DATE:" + df1.format(new Date())) ; System.out.println("DATETIME:" + df2.format(new Date())) ; } } DATE:2020年10月22日 DATETIME:2020年10月22日 中国标准时间 下午4:03:24DateFormat 类有一些附加的方法,特别是parse(),它试图按照给定的、DateFormat 对象的格式化存储来解析字符串。例如:
import java.text.*; import java.util.Date; public class DateFormatDemo2 { public static void main(String[] args) { // TODO Auto-generated method stub SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); String input = args.length == 0 ? "2020-12-12" : args[0]; System.out.print(input + " 字符提取结果是: "); Date t; try { t = ft.parse(input); System.out.println(t); } catch (ParseException e) { System.out.println("Unparseable using " + ft); } } } Console: 2020-12-12 字符提取结果是: Sat Dec 12 00:00:00 CST 2020我们可以使用格式化编码自定义日期格式的转换符,这样我门就可以使日期通过指定的转换符生成新字符串。
import java.util.*; public class PrintfDemo2 { public static void main(String[] args) { // TODO Auto-generated method stub Date date=new Date(); //b的使用,月份简称 String str=String.format(Locale.US,"英文月份简称:%tb",date); System.out.println(str); System.out.printf("本地月份简称:%tb%n",date); //B的使用,月份全称 str=String.format(Locale.US,"英文月份全称:%tB",date); System.out.println(str); System.out.printf("本地月份全称:%tB%n",date); //a的使用,星期简称 str=String.format(Locale.US,"英文星期的简称:%ta",date); System.out.println(str); //A的使用,星期全称 System.out.printf("本地星期的简称:%tA%n",date); //C的使用,年前两位 System.out.printf("年的前两位数字(不足两位前面补0):%tC%n",date); //y的使用,年后两位 System.out.printf("年的后两位数字(不足两位前面补0):%ty%n",date); //j的使用,一年的天数 System.out.printf("一年中的天数(即年的第几天):%tj%n",date); //m的使用,月份 System.out.printf("两位数字的月份(不足两位前面补0):%tm%n",date); //d的使用,日(二位,不够补零) System.out.printf("两位数字的日(不足两位前面补0):%td%n",date); //e的使用,日(一位不补零) System.out.printf("月份的日(前面不补0):%te",date); } } Console: 英文月份简称:Oct 本地月份简称:10月 英文月份全称:October 本地月份全称:十月 英文星期的简称:Thu 本地星期的简称:星期四 年的前两位数字(不足两位前面补0):20 年的后两位数字(不足两位前面补0):20 一年中的天数(即年的第几天):296 两位数字的月份(不足两位前面补0):10 两位数字的日(不足两位前面补0):22 月份的日(前面不补0):22