java基础知识(六)日期处理

时间:2022-01-22 10:23:33

一、日期处理类

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

1、Date

package com;

import java.util.Date;

/**
* Created by Administrator on 2016/11/8.
*/
public class Test { public static void main(String arg[]){
/**
* Date 有两个构造方法
* 1、用来获取当前系统时间
* 2、分配 Date 对象并初始化此对象,以表示自从标准基准时间
* (称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数
*/
Date date = new Date();
System.out.println(date);
Date date1 = new Date(123l);
Date date2 = new Date(123l);
System.out.println(date1); /**
* Date的方法,下面列出的是未过时的,获取年、月、日及格式化方法已废弃,将由Calendar类实现,以便于国际化
*/
System.out.println("测试此日期是否在指定日期之后 : " + date.after(date1));
System.out.println("测试此日期是否在指定日期之前 : " + date.before(date1));
System.out.println("返回对象的副本 : " + date.clone());
System.out.println("比较两个日期的顺序 : " + date.compareTo(date1));
System.out.println("比较两个日期的相等性 : " + date1.equals(date2));//比较的是值
System.out.println("返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 : " + date.getTime());
System.out.println("返回此对象的哈希码值 : " + date.hashCode());
date.setTime(12345l);//设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点
System.out.println("setTime设置后的date为 : " + date);
System.out.println("把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat) : " + date.toString());
} }

  java有3中比较日期的方法

  • 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
  • 使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
  • 使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。

2、SimpleDateFormat

  SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

public class Test {
public static void main(String arg[]) {
/**
*SimpleDateFormat构造方法,有4个,下面介绍常用的两个
* 1.用默认的模式和默认语言环境的日期格式符号构造
* 2 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat
*/
Date date01 = new Date();
SimpleDateFormat sdf01 = new SimpleDateFormat();
System.out.println(sdf01.format(date01));
SimpleDateFormat sdf02 = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
System.out.println(sdf02.format(date01) + "\n"); /**
* SimpleDateFormat方法
*/
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
String str = sdf.format(date);
System.out.println(str);
try {
sdf.applyLocalizedPattern("E");
System.out.println("将给定的本地化模式字符串应用于此日期格式 : " + sdf.format(date));
}catch (Exception e) {
System.out.println("input format error, error information : " + e);
}
sdf.applyPattern("yyyy-MM-dd");
System.out.println("将给定模式字符串应用于此日期格式 : " + sdf.format(date));
SimpleDateFormat sdf1 = (SimpleDateFormat) sdf.clone();
System.out.println("创建此 SimpleDateFormat 的一个副本 : " + sdf.clone());
System.out.println("比较给定对象与此 SimpleDateFormat 的相等性 : " + sdf.equals(sdf1));
StringBuffer sb = new StringBuffer("当前时间是[");
System.out.println("将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer : " + sdf.format(date, sb, new FieldPosition(1)) + "]");
System.out.println("格式化生成 AttributedCharacterIterator 的对象 : " + sdf.formatToCharacterIterator(date).getAllAttributeKeys());
System.out.println("返回在 100 年周期内被解释的两位数字年份的开始日期 : " + sdf.get2DigitYearStart());
System.out.println("解析字符串的文本,生成 Date : " + sdf.parse(str, new ParsePosition(1)));
System.out.println("返回描述此日期格式的本地化模式字符串 : " + sdf.toLocalizedPattern());
System.out.println("返回描述此日期格式的模式字符串 : " + sdf.toPattern());
} }

时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:

字母 描述 示例
G 纪元标记 AD
y 四位年份 2001
M 月份 July or 07
d 一个月的日期 10
h  A.M./P.M. (1~12)格式小时 12
H 一天中的小时 (0~23) 22
m 分钟数 30
s 秒数 55
S 毫秒数 234
E 星期几 Tuesday
D 一年中的日子 360
F 一个月中第几周的周几 2 (second Wed. in July)
w 一年中第几周 40
W 一个月中第几周 1
a A.M./P.M. 标记 PM
k 一天中的小时(1~24) 24
K  A.M./P.M. (0~11)格式小时 10
z 时区 Eastern Standard Time
' 文字定界符 Delimiter
" 单引号 `
        Date date01 = new Date();
SimpleDateFormat sdf01 = new SimpleDateFormat();
sdf01.applyLocalizedPattern("E");
System.out.println("星期几 : " + sdf01.format(date01));
sdf01.applyLocalizedPattern("D");
System.out.println("一年中的日子 : " + sdf01.format(date01));

3、Calendar

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

public class Test1 {
public static void main(String arg[]) {
/**
* Calendar字段
*/
Calendar c1 = Calendar.getInstance();
System.out.println(c1.getTime() + "\n"); System.out.println("指示年的 get 和 set 的字段数字 : " + c1.get(Calendar.YEAR));
System.out.println("指示月份的 get 和 set 的字段数字 : " + c1.get(Calendar.MONTH));
System.out.println("get 和 set 的字段数字,指示一个月中的某天 : " + c1.get(Calendar.DATE));
System.out.println("get 和 set 的字段数字,指示上午或下午的小时 : " + c1.get(Calendar.HOUR));
System.out.println("get 和 set 的字段数字,指示一小时中的分钟 : " + c1.get(Calendar.MINUTE));
System.out.println("get 和 set 的字段数字,指示一分钟中的秒 : " + c1.get(Calendar.SECOND) + "\n"); System.out.println("get 和 set 的字段数字,指示当前年中的星期数 : " + c1.get(Calendar.WEEK_OF_YEAR));
System.out.println("get 和 set 的字段数字,指示当前月中的星期数 : " + c1.get(Calendar.WEEK_OF_MONTH) + "\n"); System.out.println("get 和 set 的字段数字,指示当前年中的天数 : " + c1.get(Calendar.DAY_OF_YEAR));
System.out.println("get 和 set 的字段数字,指示一个月中的某天 : " + c1.get(Calendar.DAY_OF_MONTH));
System.out.println("get 和 set 的字段数字,指示一个星期中的某天 : " + c1.get(Calendar.DAY_OF_WEEK) + "\n"); System.out.println("get 和 set 的字段数字,指示上午或下午的小时 : " + c1.get(Calendar.HOUR));
System.out.println("get 和 set 的字段数字,指示一天中的小时 : " + c1.get(Calendar.HOUR_OF_DAY) + "\n"); /**
* Calendar方法
*/
c1.add(Calendar.YEAR, 1);
System.out.println("根据日历的规则,为给定的日历字段添加或减去指定的时间量 : " + c1.getTime());
Calendar c2 = Calendar.getInstance();
System.out.println("判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果 : " + c1.after(c2));
System.out.println("判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果 : " + c1.before(c2));
//c2.clear();
//System.out.println("将此 Calendar 的所日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义 : " + c2.getTime());
//c2.clear(Calendar.YEAR);
//System.out.println("将此 Calendar 的给定日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义 : " + c2.getTime());
System.out.println("比较两个 Calendar 对象表示的时间值(从历元至现在的毫秒偏移量) : " + c1.compareTo(c2));
System.out.println("返回给定日历字段的值 : " + c2.get(Calendar.YEAR));
System.out.println("给定此 Calendar 的时间值,返回指定日历字段可能拥有的最大值 : " + c2.getActualMaximum(Calendar.YEAR));
System.out.println("给定此 Calendar 的时间值,返回指定日历字段可能拥有的最小值 : " + c2.getActualMinimum(Calendar.YEAR));
System.out.println("获取一星期的第一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY : " + c2.getFirstDayOfWeek()); System.out.println("返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象 : " + c2.getTime());
System.out.println("返回此 Calendar 的时间值,以毫秒为单位 : " + c2.getTimeInMillis());
System.out.println("获得时区 : " + c2.getTimeZone().getDisplayName());
c2.roll(Calendar.DATE, 1);
System.out.println("向指定日历字段添加指定(有符号的)时间量,不更改更大的字段 : " + c2.getTime());
c2.set(Calendar.YEAR, 2002);
System.out.println("将给定的日历字段设置为给定值 : " + c2.getTime());
c2.set(1997, 7, 1, 0, 0);
System.out.println(" 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值 : " + c2.getTime());
c2.set(1997, 7, 1, 0, 0, 0);
System.out.println("设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值 : " + c2.getTime());
c2.setTime(new Date());
System.out.println("使用给定的 Date 设置此 Calendar 的时间 : " + c2.getTime());
} }

二、常用的日期处理方法

public class DateUtil {

    public final static String FORMAT_19 = "yyyy-MM-dd hh:mm:ss";
public final static String FORMAT_10 = "yyyy-MM-dd";
public final static String FORMAT_CN_19 = "yyyy年MM月dd日 hh时mm分ss秒";
public final static String FORMAT_CN_10 = "yyyy年MM月dd日"; /**
* 日期转为指定格式
*/
public static String parsDateToString(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
} /**
* 字符串转换为日期
*/
public static Date parsStringToDate(String formatDate, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date date = null;
try {
date = sdf.parse(formatDate);
} catch (ParseException e) {
System.out.println("输入日期格式不正确,异常信息:" + e);
}
return date;
} /**
* 获得指定日期的前num个月的日期
*/
public static Date beforeMonth(Date date, int num) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(calendar.MONTH, num * -1);
Date dBefore = calendar.getTime();
return dBefore;
} private static Calendar dateToCalendar(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
} /**
* 日期为所在月的第几周
*/
public static int weekOfMonth(Date date) {
return dateToCalendar(date).get(Calendar.WEEK_OF_MONTH);
} /**
* 日期为所在年的第几周
*/
public static int weekOfYear(Date date) {
return dateToCalendar(date).get(Calendar.WEEK_OF_YEAR);
} /**
* 日期为所在年的第几天
*/
public static int dayOfYear(Date date) {
return dateToCalendar(date).get(Calendar.DAY_OF_YEAR);
} /**
* 根据一个时间获取该时间为星期几
*/
public static String dayOfWeek(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("E");
return sdf.format(date);
} /**
* 计算两个时间之间的天数
*/
public static int countDaysBetween(Date d1, Date d2) {
Calendar c1 = dateToCalendar(d1);
Calendar c2 = dateToCalendar(d2);
return Math.abs(Math.abs(c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR)) * 365 + (c1.get(Calendar.DAY_OF_YEAR) - c2.get(Calendar.DAY_OF_YEAR)));
} public static void main(String[] args) {
String formatDate = DateUtil.parsDateToString(new Date(), DateUtil.FORMAT_CN_19);
System.out.println("日期转为指定格式 : " + formatDate);
System.out.println("字符串转换为日期 : " + parsStringToDate(formatDate, DateUtil.FORMAT_CN_19));
System.out.println("获得指定日期的前num个月的日期 : " + beforeMonth(new Date(), 3));
System.out.println("日期为所在月的第几周 : " + weekOfMonth(new Date()));
System.out.println("日期为所在年的第几周 : " + weekOfYear(new Date()));
System.out.println("日期为所在年的第几天 : " + dayOfYear(new Date()));
System.out.println("日期是星期几 : " + dayOfWeek(new Date()));
Calendar c = Calendar.getInstance();
c.set(2017, 10, 25);
System.out.println("计算两个时间之间的天数 : " + countDaysBetween(new Date(), c.getTime())); }
}

java基础知识(六)日期处理的更多相关文章

  1. Java基础知识系列——日期

    日期类型也是在编程中经常用到的一种数据类型. Java中的日期类型为Date. 另外需要记住三个类: java.text.SimpleDateFormat; java.util.Calendar; j ...

  2. java 基础知识六 字符串1

    java  基础知识六  字符串1 String 不是java的基本数据类型 String 不是java的基本数据类型 String 不是java的基本数据类型 字符串是是一个字符序列 1.创建 创建 ...

  3. 类、对象(java基础知识六)

    1.Java约定俗成 java约定俗成 1,类名接口名 一个单词首字母大写,多个单词每个单词首字母都大写 2,方法名和变量名 一个单词全部小写,多个单词从第二个单词首字母大写 建议:如果能用英语尽量用 ...

  4. java 基础知识六 字符串2

    java  基础知识六  字符串2 1.String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法 . String 是不可变对象,也就是一旦创建,那么整 ...

  5. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  6. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  7. 黑马毕向东Java基础知识总结

    Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记    侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...

  8. java基础知识文章汇总

    将之前的所有关于Java基础知识的随笔,整理成质量较高的十几篇随笔,几乎是好几篇比较零散的随笔合成现在的一篇,自认为还不错. java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规 ...

  9. Java基础知识陷阱系列

    Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...

  10. java基础知识一览(二)

    一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...

随机推荐

  1. 对List中对象的去重

    今天项目中遇到了一个对List中对象去重的问题. 首先对于我们自己系统中的对象我们只要重写该对象的 equal 和 hashcode 即可(利用对象中的能够唯一确定对象的属性). 但是我遇到的不是本系 ...

  2. eclipse html插件的下载和安装

    需求:需要在eclipse里面编辑html和jsp,语法高亮和语法提示,自动补全等. 1.下载GEF(依赖包): http://www.eclipse.org/downloads/download.p ...

  3. springMVC能做什么,做j2ee时候要考虑什么

    转载: http://jinnianshilongnian.iteye.com/category/231099 [置顶] 跟我学SpringMVC目录汇总贴.PDF下载.源码下载 博客分类: 跟开涛学 ...

  4. 【HDOJ】1276 士兵队列训练问题

    初看这道题目很像尤瑟夫问题, 区别是每次都是从1开始.解法也很类似.数学解递推公式.假定第K次报数后,余下人数不超过3个人.若第K次为1-3报数,那么由这三个数的当前索引n可推上一次报数之前的编号为n ...

  5. lua的string库与强大的模式匹配

    lua原生解释器对字符串的处理能力是十分有限的,强大的字符串操作能力来自于string库.lua的string函数导出在string module中.在lua5.1,同一时候也作为string类型的成 ...

  6. C# Linq处理list数据

    获取数据列表. //获取数据列表,Model是类 IList<Model> list = dao.getmx(Model, pageInfo);//DataTable数据DataTable ...

  7. 二&comma;编程语言类别&comma;和python变量基础

    编程语言类别 机器语言:由二进制组成,直接控制操作硬件,执行效率高,开发效率低. 汇编语言:用英文代替二进制,直接操作控制硬件,执行效率高,开发效率低. 高级语言: 编译型,如C语言,类似谷歌翻译,先 ...

  8. codeforces 547c&sol;&sol; Mike and Foam&sol;&sol; Codeforces Round &num;305&lpar;Div&period; 1&rpar;

    题意:给出数组arr和一个空数组dst.从arr中取出一个元素到dst为一次操作.问每次操作后dst数组中gcd等于1的组合数.由于数据都小于10^6,先将10^6以下的数分解质因数.具体来说从2开始 ...

  9. ngular6开发不完全笔记(三)-- 报错指南

    router Uncaught Error: Template parse errors: 'router-outlet' is not a known element: If 'router-out ...

  10. js foreach

    array1.forEach(callbackfn[, thisArg]) 参数 定义 array1 必需. 一个数组对象. callbackfn 必需. 一个接受最多三个参数的函数. 对于数组中的每 ...