资讯专栏INFORMATION COLUMN

Java日期类分析

Wuv1Up / 818人阅读

摘要:用的时候再转化成年月日时分秒。创建日期对象代表当前时间从年月日早上点分秒开始经历了毫秒也就是秒的时间获取一个时间的毫秒数,返回一个型的整数。

时间原点概念

计算机语言中的时间原点都是从1970年1月1日8点0分0秒开始算的,就相当于时间的0。
为什么对应1970年呢?
其实,现在大部分计算机系统使用的时间都是UNIX时间,而UNIX或类UNIX系统使用的时间表示方式是:从协调世界时1970年1月1日0时0分0秒起至现在的总秒数,不包括闰秒。
为什么是8点?
因为中国的太平洋时区是UTC-8,刚好和格林威治时间差8个小时。

时间是怎么计算的

Unix系统有一个时间戳(timestamp),这个时间戳是系统和程序用来计时的一个东西,表示从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。用的时候再转化成年月日时分秒。后来随着UNIX的普及这个方法也被普及,很多后来出现的计算机都用这种方法记录时间,java、数据库、许多精密的仪器等也自然也遵循了这一约束。
意思就是所有的日期,都是以时间原点这个0点为基准,每过一毫秒,就+1,单位是毫秒。

创建日期对象
Date d1 = new Date();  //代表当前时间
Date d2 = new Date(5000); //从1970年1月1日 早上8点0分0秒 开始经历了5000毫秒(也就是5秒)的时间
getTime

getTime() :获取一个时间的毫秒数,返回一个long型的整数。
例:

Date d1 = new Date();  //代表当前时间
Long time = d1.getTime(); //当前时间毫秒数
System.out.println("当前时间:" + d1); //输出结果为Thu May 17 11:57:49 CST 2018 表示现在是2018年5月17日11:57:49
System.out.println("当前时间毫秒数:" + time); //输出结果为1526529469712 ,表示从1970年1月1日8点至现在经过了1526529469712毫秒

还有一个方法与getTime的作用是一样的 -> System.currentTimeMillis();

实例

下面通过一个实例来理解上面的概念:
借助随机数,创建一个从1995.1.1 00:00:00 到 1995.12.31 23:59:59 之间的随机日期

//第一步,计算1995年的毫秒数
long second = 1000; //一秒为1000毫秒
long min = second * 60; //一分钟
long hour = min * 60;//一小時
long day = hour * 24;//一天
long year = day * 365;//一年
long leapday = (1995-1970)/4 * day; //每隔四年就有一個闰日
long eightHour = 8 * hour; //1997年8点才是真正开始时间,所以要算1995年1月1日0点得减去8个小時
long _1995Start = year * (1995-1970) + leapday - eightHour; //1995年的毫秒数(从1970年算起)
System.out.println("1995年的第一天:" + new Date(_1995Start));
System.out.println("1995年的最后一天:" + new Date(_1995Start+year-1));
//第二步,定义一个随机时间
long randomTime = (long)(Math.random() * (year-1) + _1995Start);
Date randomDate = new Date(randomTime);
System.out.println("1995年里的随机一天:" + randomDate);

Date d1 = new Date();  //代表当前时间
Long time = d1.getTime(); //从1970年1月1日 早上8点0分0秒 开始经历了5000毫秒(也就是5秒)的时间
System.out.println("当前时间:" + d1);
System.out.println("当前时间毫秒数:" + time);

运行结果:
1995年的第一天:Sun Jan 01 00:00:00 CST 1995
1995年的最后一天:Sun Dec 31 23:59:59 CST 1995
1995年里的随机一天:Wed Sep 20 02:54:59 CST 1995

日期格式化

上面的例子直接打印对象,会看到 “Wed Sep 20 02:54:59 CST 1995” 这样的格式,可读性比较差,为了获得“1995/9/20 02:54:59”这样的格式,就要将日期进行格式化。
y 代表年
M 代表月
d 代表日
H 代表24进制的小时
h 代表12进制的小时
m 代表分钟
s 代表秒
S 代表毫秒

SimpleDateFormat 日期格式化类
format 日期转字符串
parse 字符串转日期

1.日期转字符串

SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS" );
Date d= new Date();
String str = sdf.format(d);
System.out.println("当前时间通过 yyyy-MM-dd HH:mm:ss SSS 格式化后的输出: "+str);

输出结果: 当前时间通过 yyyy-MM-dd HH:mm:ss SSS 格式化后的输出: 2018-05-17 15:38:42 224

2.字符串转日期
模式(yyyy/MM/dd HH:mm:ss)需要和字符串格式保持一致,如果不一样就会抛出解析异常ParseException

SimpleDateFormat sdf =new SimpleDateFormat("yyyy/MM/dd HH:mm:ss" );
  
String str = "2016/1/5 12:12:12";

try {
Date d = sdf.parse(str);
System.out.printf("字符串 %s 通过格式  yyyy/MM/dd HH:mm:ss %n转换为日期对象: %s",str,d.toString());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Calendar类

Calendar类即日历类,常用于进行“翻日历”,比如下个月的今天是多久
1.Calendar与Date进行转换

//采用单例模式获取日历对象Calendar.getInstance();
Calendar c = Calendar.getInstance();

Date d2 = new Date(0);
c.setTime(d2); //把这个日历,调成日期 : 1970.1.1 08:00:00
Date d = c.getTime();//通过日历对象得到日期对象
System.out.println("当前日历的日起对象: "+d);

输出结果为:Thu Jan 01 08:00:00 CST 1970

2.翻日历
add方法,在原日期上增加年/月/日
set方法,直接设置年/月/日

private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
Date now = c.getTime();
// 当前日期
System.out.println("当前日期:	" + format(c.getTime()));

// 下个月的今天
c.setTime(now);
c.add(Calendar.MONTH, 1);
System.out.println("下个月的今天:	" +format(c.getTime()));

// 去年的今天
c.setTime(now);
c.add(Calendar.YEAR, -1);
System.out.println("去年的今天:	" +format(c.getTime()));

// 上个月的第三天
c.setTime(now);
c.add(Calendar.MONTH, -1);
c.set(Calendar.DATE, 3);
System.out.println("上个月的第三天:	" +format(c.getTime()));

}

private static String format(Date time) {
return sdf.format(time);
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69415.html

相关文章

  • Java编程基础15——正则表达式&常用工具

    摘要:正则表达式的概述和简单使用正则表达式是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。例如,在表达式中,存在四个这样的组组零始终代表整个表达式。 1_正则表达式的概述和简单使用 A:正则表达式 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。 作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个...

    miqt 评论0 收藏0
  • java常见API第二部分

    摘要:类是日期时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换也就是可以在对象与对象之间进行来回转换。构造方法由于为抽象类,不能直接使用,所以需要常用的子类。 day01【Object类、常用API】 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 教学目标 -[ ] 能够说出...

    maybe_009 评论0 收藏0
  • Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问

    摘要:是开始提供的时间日期,主要用来优化以前对于时间日期的处理操作。然而,我们在使用或使用的时候,往往会发现使用请求参数或返回结果中有的时候会发生各种问题。 LocalDate、LocalTime、LocalDateTime是Java 8开始提供的时间日期API,主要用来优化Java 8以前对于时间日期的处理操作。然而,我们在使用Spring Boot或使用Spring Cloud Fei...

    UCloud 评论0 收藏0
  • 国外程序员整理的Java资源大全

    摘要:日期和时间处理日期和时间的函数库。使用中可观察序列,创建异步基于事件应用程序的函数库。为分布式系统提供延迟和容错处理。发布使用本机格式分发应用程序的工具。将程序资源和打包成和的本机文件。图像处理用来帮助创建评估或操作图形的函数库。 好资源要分享原文 译者 唐尤华 翻译自 github akullpp 构建 这里搜集了用来构建应用程序的工具。 Apache Maven:Mave...

    chengtao1633 评论0 收藏0
  • 20 个案例教你在 Java 8 中如何处理日期和时间?

    摘要:前言前面一篇文章写了如何安全的使用里面介绍了如何处理日期时间,以及如何保证线程安全,及其介绍了在中的处理时间日期默认就线程安全的类。引入了全新的日期时间格式工具,线程安全而且使用方便。 前言 前面一篇文章写了《SimpleDateFormat 如何安全的使用?》, 里面介绍了 SimpleDateFormat 如何处理日期/时间,以及如何保证线程安全,及其介绍了在 Java 8 中的处...

    Rango 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<