1、JAVA中日期的获取、设置和格式化

(1)JAVA提供了3个日期类:Date、Calendar和DateFormat。

Date()方法主要用于创建日期对象并获取日期;

Calendar()方法主要用于获取和设置日期;

DateFormat()方法主要用于创建日期格式化器,然后再由格式化器将日期转换为各种日期格式串输出。

(2)JAVA语言规定的基准日期为格林尼治标准时间1970.1.1.00:00:00,当前日期是由基准日期开始所经历的毫秒数转换出来的。

(3)DateFomat类在java.text包中,Date和Calendar类在java.util包中。

(4)实例如下:import java.util.*; import java.text.*;

public class DisplayDate {

public static void main(String[] args){

Date today;

Calendar now;

DateFormat f1,f2;

String s1,s2;

System.out.println("\n显示Date类的相关用法");

today = new Date(); System.out.println("new Date()= \t"+ today);

System.out.println("\n用DateFormat类显示各种日期格式");

//显示各种日期格式

f1 = DateFormat.getDateInstance(); s1 = f1.format(today);

System.out.println("DateFormat.getDateInstance()= \t"+s1);

f1 = DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA);

s1 = f1.format(today);

System.out.println("DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA)=

\t"+ s1);

f1 = DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA);

s1 = f1.format(today);

System.out.println("DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA)= \t"+ s1);

f1 = DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA);

s1 = f1.format(today);

System.out.println("DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA)=

\t" + s1);

System.out.println("\n用DateFormat类显示各种时间格式");

//显示各种时间格式

f1 = DateFormat.getTimeInstance();

s1 = f1.format(today);

System.out.println("DateFormat.getTimeInstance()= \t"+s1);

f1 = DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA);

s1 = f1.format(today);

System.out.println("DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA)=

\t"+s1);

f1 = DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA);

s1 = f1.format(today);

System.out.println("DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA)= \t"+s1);

f1 = DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA);

s1 = f1.format(today);

System.out.println("DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA)= \t"+s1);

System.out.println("\n显示Calendar的相关时间用法");

now = Calendar.getInstance(); today = now.getTime();

System.out.println("Calendar.getInstance().getTime()= \t"+

today.toString());

}

}

程序运行结果显示如下:

显示Date类的相关用法

new Date()= Fri May 02 13:29:32 CST 2003

用DateFormat类显示各种日期格式

DateFormat.getDateInstance()= 2003-5-2

DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA)= 2003年5月2日

DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA)= 2003-5-2

DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA)= 03-5-2

用DateFormat类显示各种时间格式

DateFormat.getTimeInstance()= 13:29:32

DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA)= 下午01时29分32秒

DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA)= 13:29:32

DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA)= 下午1:29

显示Calendar的相关时间用法

Calendar.getInstance().getTime()= Fri May 02 13:29:33

CST 2003

2、SimpleDateFormat1. SimpleDateFormat 介绍        SimpleDateFormat 是DateFormat的子类,一个格式化Date 以及 解析日期字符串 的工具。它的最常用途是,能够按照指定的格式来对Date进行格式化,然后我们使用可以格式化Date后得到的字符串。

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

SimpleDateFormat的构造函数:

构造函数SimpleDateFormat()

SimpleDateFormat(String pattern)

SimpleDateFormat(String template, DateFormatSymbols value)

SimpleDateFormat(String template, Locale locale)

非构造函数void    applyLocalizedPattern(String template)

void    applyPattern(String template)

Object    clone()

boolean    equals(Object object)

StringBuffer    format(Date date, StringBuffer buffer, FieldPosition fieldPos)

AttributedCharacterIterator    formatToCharacterIterator(Object object)

Date    get2DigitYearStart()

DateFormatSymbols    getDateFormatSymbols()

int    hashCode()

Date    parse(String string, ParsePosition position)

void    set2DigitYearStart(Date date)

void    setDateFormatSymbols(DateFormatSymbols value)

String    toLocalizedPattern()

String    toPattern()

SimpleDateFormat 简单示范:// 新建date对象,时间是2013-09-19

Date date = new Date(113,8,19);

// 新建“SimpleDateFormat对象”,并设置 sdf 的“格式化模式”

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

// 用 sdf 格式化 date,并返回字符串。

String str = sdf.format(date);

2. SimpleDateFormat 相关格式说明

2.1 日期和时间模式        日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来,以免进行解释。"''" 表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。

定义了以下模式字母(所有其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保留):字母日期或时间元素表示示例GEra 标志符TextAD

y年Year1996; 96

M年中的月份MonthJuly; Jul; 07

w年中的周数Number27

W月份中的周数Number2

D年中的天数Number189

d月份中的天数Number10

F月份中的星期Number2

E星期中的天数TextTuesday; Tue

aAm/pm 标记TextPM

H一天中的小时数(0-23)Number0

k一天中的小时数(1-24)Number24

Kam/pm 中的小时数(0-11)Number0

ham/pm 中的小时数(1-12)Number12

m小时中的分钟数Number30

s分钟中的秒数Number55

S毫秒数Number978

z时区General time zonePacific Standard Time; PST; GMT-08:00

Z时区RFC 822 time zone-0800

模式字母通常是重复的,其数量确定其精确表示:

Text: 对于格式化来说,如果模式字母的数量大于等于 4,则使用完全形式;否则,在可用的情况下使用短形式或缩写形式。对于解析来说,两种形式都是可接受的,与模式字母的数量无关。

Number: 对于格式化来说,模式字母的数量是最小的数位,如果数位不够,则用 0 填充以达到此数量。对于解析来说,模式字母的数量被忽略,除非必须分开两个相邻字段。

Year: 如果格式器的 Calendar 是格里高利历,则应用以下规则。

Month: 如果模式字母的数量为 3 或大于 3,则将月份解释为 text;否则解释为 number。

对于格式化来说,如果模式字母的数量为 2,则年份截取为 2 位数,否则将年份解释为 number。

对于解析来说,如果模式字母的数量大于 2,则年份照字面意义进行解释,而不管数位是多少。因此使用模式 "MM/dd/yyyy",将 "01/11/12" 解析为公元 12 年 1 月 11 日。

在解析缩写年份模式("y" 或 "yy")时,SimpleDateFormat 必须相对于某个世纪来解释缩写的年份。这通过将日期调整为 SimpleDateFormat 实例创建之前的 80 年和之后 20 年范围内来完成。例如,在 "MM/dd/yy" 模式下,如果 SimpleDateFormat 实例是在 1997 年 1 月 1 日创建的,则字符串 "01/11/12" 将被解释为 2012 年 1 月 11 日,而字符串 "05/04/64" 将被解释为 1964 年 5 月 4 日。在解析时,只有恰好由两位数字组成的字符串(如 Character#isDigit(char) 所定义的)被解析为默认的世纪。其他任何数字字符串将照字面意义进行解释,例如单数字字符串,3 个或更多数字组成的字符串,或者不都是数字的两位数字字符串(例如"-1")。因此,在相同的模式下, "01/02/3" 或 "01/02/003" 解释为公元 3 年 1 月 2 日。同样,"01/02/-3" 解析为公元前 4 年 1 月 2 日。

否则,则应用日历系统特定的形式。对于格式化和解析,如果模式字母的数量为 4 或大于 4,则使用日历特定的 long form。否则,则使用日历特定的 short or abbreviated form。

SimpleDateFormat 还支持本地化日期和时间模式 字符串。在这些字符串中,以上所述的模式字母可以用其他与语言环境有关的模式字母来替换。SimpleDateFormat 不处理除模式字母之外的文本本地化;而由类的客户端来处理。

示例

以下示例显示了如何在美国语言环境中解释日期和时间模式。给定的日期和时间为美国太平洋时区的本地时间 2001-07-04 12:08:56。日期和时间模式结果"yyyy.MM.dd G 'at' HH:mm:ss z"2001.07.04 AD at 12:08:56 PDT

"EEE, MMM d, ''yy"Wed, Jul 4, '01

"h:mm a"12:08 PM

"hh 'o''clock' a, zzzz"12 o'clock PM, Pacific Daylight Time

"K:mm a, z"0:08 PM, PDT

"yyyyy.MMMMM.dd GGG hh:mm aaa"02001.July.04 AD 12:08 PM

"EEE, d MMM yyyy HH:mm:ss Z"Wed, 4 Jul 2001 12:08:56 -0700

"yyMMddHHmmssZ"010704120856-0700

"yyyy-MM-dd'T'HH:mm:ss.SSSZ"2001-07-04T12:08:56.235-0700

日期格式是不同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须是外部同步的。

3、部分方法实例

1.Calendar和Date的转化(1) Calendar转化为DateCalendar cal=Calendar.getInstance();

Date date=cal.getTime();

(2)  Date转化为CalendarDate date=new Date();

Calendar  cal=Calendar.getInstance();

cal.setTime(date);

2.格式化输出日期时间及将日期转换为字符串Date date=new Date();

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

System.out.println(df.format(date));

String dateStr = "2017-01-01 18:00:00";

SimpleDateFormat df24 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println(df24.parse(dateStr));

3.计算某一月份的最大天数Calendar

time=Calendar.getInstance();

time.clear();

time.set(Calendar.YEAR,year);

time.set(Calendar.MONTH,i-1);//注意,Calendar对象默认一月为0

int

day=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天数

注:在使用set方法之前,必须先clear一下,否则很多信息会继承自系统当前时间

4.计算一年中的第几星期

(1)计算某一天是一年中的第几星期Calendar cal=Calendar.getInstance();

cal.set(Calendar.YEAR, 2006);

cal.set(Calendar.MONTH, 8);

cal.set(Calendar.DAY_OF_MONTH, 3);

int weekno=cal.get(Calendar.WEEK_OF_YEAR);

(2)计算一年中的第几星期是几号SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");

Calendar cal=Calendar.getInstance();

cal.set(Calendar.YEAR, 2006);

cal.set(Calendar.WEEK_OF_YEAR, 1);

cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

System.out.println(df.format(cal.getTime()));

//输出: 2006-01-02

5.add()和roll()的用法

(1)add()方法SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");

Calendar cal=Calendar.getInstance();

cal.set(Calendar.YEAR, 2006);

cal.set(Calendar.MONTH, 8);  //MONTH是从0开始计的,这里输出是9月

cal.set(Calendar.DAY_OF_MONTH, 3);

cal.add(Calendar.DATE, -4);

Date date=cal.getTime();

System.out.println(df.format(date));

cal.add(Calendar.DATE, 4);

date=cal.getTime();

System.out.println(df.format(date));

//输出:2006-08-30

//输出:2006-09-03

(2)roll方法cal.set(Calendar.YEAR, 2006);

cal.set(Calendar.MONTH, 8);

cal.set(Calendar.DAY_OF_MONTH, 3);

cal.roll(Calendar.DATE, -4);

date=cal.getTime();

System.out.println(df.format(date));

cal.roll(Calendar.DATE, 4);

date=cal.getTime();

System.out.println(df.format(date));

//输出:2006-09-29

//输出:2006-09-03

可见,roll()方法在本月内循环,一般使用add()方法;

6.计算两个任意时间中间的间隔天数        (1)传进Calendar对象/*

* 计算两个时间之间相隔天数

* @param startday 开始时间

* @param endday 结束时间

* @return

*/

public int getIntervalDays(Calendar startday,Calendar endday){

//确保startday在endday之前

if(startday.after(endday)){

Calendar cal=startday;

startday=endday;

endday=cal;

}

//分别得到两个时间的毫秒数

long sl=startday.getTimeInMillis();

long el=endday.getTimeInMillis();

long ei=el-sl;

//根据毫秒数计算间隔天数

return (int)(ei/(1000*60*60*24)); }

(2)传进Date对象/*

*计算两个时间之间相隔天数

* @param startday 开始时间

* @param endday 结束时间

* @return

*/

public int getIntervalDays(Date startday,Date endday){

//确保startday在endday之前

if(startday.after(endday)){

Date cal=startday;

startday=endday;

endday=cal;

}

//分别得到两个时间的毫秒数

long sl=startday.getTime();

long el=endday.getTime();

long ei=el-sl;

//根据毫秒数计算间隔天数

return (int)(ei/(1000*60*60*24));

}

//同理,可以用相同的方法计算出任意两个时间相隔的小时数,分钟数,秒钟数等 注:以上方法是完全按时间计算,有时并不能令人满意,如:

startday="2006-10-11 20:00:00"

endday="2006-10-12 8:00:00"

//计算结果为0,但是我们也许相让计算结果变为1,此时可以用如下方法实现: 在传参之前,先设定endday的时间,如:

endday.set(Calendar.HOUR_OF_DAY, 23);

endday.set(Calendar.MINUTE, 59);

endday.set(Calendar.SECOND, 59);

endday.set(Calendar.MILLISECOND, 59);

//这样再传进去startday,endday,则结果就如我们所愿了。不过,如果嫌以上方法麻烦,可以参考以下方法:

(3)改进精确计算相隔天数的方法public int getDaysBetween (Calendar d1, Calendar d2) {

if (d1.after(d2)) {

// swap dates so that d1 is start and d2 is end

java.util.Calendar swap = d1;

d1 = d2;

d2 = swap;

}

int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);                  int y2 = d2.get(Calendar.YEAR);

if (d1.get(Calendar.YEAR) != y2) {

d1 = (Calendar) d1.clone();

do {

days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);

//得到当年的实际天数

d1.add(Calendar.YEAR, 1);

} while (d1.get(Calendar.YEAR) != y2);

}

return days;

}

java date 操作类_JAVA时间操作类常用方法汇总相关推荐

  1. Java Calendar 日历类的时间操作 Timestamp Date Calendar 相互转换

    Java Calendar 日历类的时间操作,这也许是 Java 环境下创建和管理日历及操作时间最简单的一个方案了,示范代码也很简单. 演示了获取时间,日期时间的累加和累减,以及日期时间的比较. 原文 ...

  2. java calendar 设置小时_Calendar 日历类的时间操作

    我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年....某些网站会记录下用户登陆的时间,比如银行的一些网站,对于这些经常需要处理的问题,Java中提供 ...

  3. java date格式化输出_Java Date类以及日期的格式化输出

    Java中的Date类用于表示日期时间,在java.util包中.虽然Date类在设计之初没有考虑到国际化,很多方法都已经被定义为过时,但是Date却是程序设计过程中经常用到的一个类.本文将说说Dat ...

  4. java 系统 类_Java常用实体类--System类

    字符串.日期.数字是Java程序中最常使用的数据对象,对这些数据的创建.修改.格式化和转换等操作融入在Java程序的每个角落,必须熟练掌握.本节将通过实例演示以下常用实体类Java系统级类:系统类Sy ...

  5. java unsafe 类_Java的Unsafe类

    本文转载自:https://www.cnblogs.com/pkufork/p/java_unsafe.html 最近在看Java并发包的源码,发现了神奇的Unsafe类,仔细研究了一下,在这里跟大家 ...

  6. java 中的class类_Java中Class类简介

    Java中Class类简介 1. 在面向对象的世界里,万事万物皆对象.(java语言中,静态的成员.普通数据类型除外) 类是不是对象呢?类是(哪个类的对象呢?)谁的对象呢? -- 类是对象,类是jav ...

  7. java创建一个人函数类_Java对象和类–学习如何创建和实现

    对象和类被认为是任何基于OOPs的语言的精华.由于Java是最常用的面向对象编程语言之一,因此非常有必要牢记这些概念.因此,我为您带来这篇文章,在这里我将给您一个完整的Java对 对象和类被认为是任何 ...

  8. java 枚举的继承_java中枚举类可以被继承吗?

    java 枚举类 java中,使用关键字enum来定义枚举类,枚举类是一个特殊的类,大部分功能和普通类是一样的,区别为: ● 枚举类继承了java.lang.Enum类,而不是默认的Object类.而 ...

  9. java ssh工具类_JAVA SSH2工具类

    计划 ssh2utils connection 常规session操作 未完成 常规scf操作 未完成 简介 使用java进行ssh 操作,执行脚本,scp文件的包装 依赖 com.trilead t ...

最新文章

  1. .ajax get获取案例,$.ajax GET请求案例
  2. CMake生成Opencv在vs 2013的解决方案(出错1)
  3. 互联网金融行业申请评分卡(A卡)简介
  4. 二手交易平台html代码,二手物品交易HTML5模板
  5. 安卓案例:在同一Activity里切换Fragment
  6. voxelnet_苹果最新机器学习论文:使用VoxelNet进行3D物体检测
  7. 朴素贝叶斯文本分类代码(详解)
  8. tomcat自定义错误页面
  9. 财务人员懂计算机语言,评论:用电算化促财务管理的现代化
  10. 社区发现算法——COPRA算法
  11. 北京人口密度分布、人口趋势分析
  12. SFTP上传下载文件工具类
  13. 王道计算机网络 第三章 数据链路层
  14. CCNP之IGP学习笔记(2022)
  15. 周报格式(sohu)
  16. Font and PDF
  17. 何为集中式版本控制系统与分布式版本控制系统?
  18. 国产CNC数控机床现状
  19. Flash 全屏代码
  20. 人工智能英文原版PDF教材1.03G资源包Artificial Intelligence

热门文章

  1. 【ThinkPHP系列篇】ThinkPHP框架使网页能够在浏览器中访问(二)
  2. 1095 Cars on Campus (30 分)【难 / 模拟 未完成】
  3. vi和vim的基础使用
  4. C语言易错题集 第二部
  5. HTTPSession对象知识总结
  6. Quartz整合Spring
  7. Hibernate中Session的清理与清空
  8. python多线程多进程多协程_python 多进程、多线程、协程
  9. 后端服务不得不了解之限流
  10. 实战上亿数据,如何实现秒查!