java --时间类型

时间类

   在计算机中,时间的表示是一个较大的概念,现有的系统基本都是利用从1970.1.1 00:00:00 到当前时间的毫秒数进行计时,这个时间称为epoch。在后文中如果没有明确说明,毫秒数就是指从1970年到对应时间的毫秒数。在Java 的Date类内部其实也是一个毫秒数,对外表现为一个Date对象,

    java在jdk1.1 之前负责所有和时间操作有关的功能也就是 (日期的表示,2日期的转换,3日期的设定修改) 这三种功能 。在jdk1.1 之后 将java 有关的时间操作分成了三个类 也就是时间表示类型Date  时间操作类Calendar 时间格式DateFormat

   Date类负责时间的表示、

   Calendar是一个抽象工具类,负责对Date类进行修改等操作,以及从Date类中提取年月日等时间的特定信息。

   DateFormat 则负责日期的转换,比如读取特定格式的字符串,转换成date对象,或者将date对象按照指定的格式转成字符串。

1) Date类 

   我们看一下Date类的api手册 虽然方法很多 但是大部分弃用  也就是转移到其他两个类中 


     Date有两个构造器 Date() 和Date(long date)

      我们看一下这两个构造器的区别


public class text {
	public static void main(String[] args) {
		Date d=new Date();
		System.out.println(d);
		//输出:Fri Nov 26 18:40:49 CST 2018
		Date d1=new Date(10000);
		System.out.println(d1);
		//输出:Thu Jan 01 08:00:10 CST 1970
		
	}
}

由上代码段 不难看出 无参构造器返回的就是当前时间

而Date(long date)构造器返回的是距离纪元时间(也就是1970年0点 我们处于东八区 所以是八点)date毫秒的时间点。

 // Date()的源码
 public Date() {
        this(System.currentTimeMillis());
    }
 public Date(long date) {
        fastTime = date;
    }
private transient long fastTime;

//Date(long date)的源码
public Date(long date) {
        fastTime = date;
    }
private transient long fastTime;

可以看出无参构造函数其实是调用了系统的当前毫秒数。最终都是将fastTime这个属性赋值一个对应时间的毫秒数。

正如我们之前讲过的,Date类内部其实是一个从1970到其代表的时间之间的毫秒数,那就必然有一个数据要表示这个毫秒数,这就是 fastTime这个域的作用了。

我们看一下date的常用方法

//返回now对象距离纪元的毫秒数
		 long  times = now.getTime();
		 System.out.println(times);
		 //输出1543576035995
 //设置距离纪元time毫秒数的时间点
		 now.setTime(10000);
		 System.out.println(now);
		 //输出Thu Jan 01 08:00:10 CST 1970

api内弃用的方法虽然不推荐用 但是也可以用 不过有一个横线表示

2) Calendar类

 Calendar类前面说是一个工具类,其实它比工具类还是更深一步的,它更像是一个加强版的Date类。一般的工具类会提供一堆static方法,工具类本身并不存储对象。但是Calendar类不是像一般的工具类只提供一堆static方法,而是在其内部本身就有一个毫秒数,所以它不是对外部Date对象操作,而是对内部的毫秒数进行转化,所以说Calendar本身就包含了日期时间信息,像一个装饰者模式。
 

 Date now3 = new Date();
		 //获取当前时间对象
		 Calendar calendar = Calendar.getInstance();
		 //用工厂方法创建一个calendar实例
		 calendar.setTime(now3);
		 //将date对象传给calendar
		 System.out.println(calendar.get(Calendar.YEAR));
		 //获取年份 输出为:2018
		 System.out.println(calendar.get(Calendar.MONTH));
		 //获取月份 输出为:10
		 calendar.set(Calendar.YEAR, 2016);
		 //将年份修改为2016
		 calendar.set(Calendar.MONTH, 6);
		//将年份修改为2016 将月份修改为6月
		 calendar.set(Calendar.DAY_OF_MONTH, 16);
		 //将日修改为当前月第6天
		 System.out.println(calendar.getTime());
		 //输出当前时间 Sat Jul 16 19:19:50 CST 2016

实际上Calendar有多个的工厂构造方法 但最终都调用了

private static Calendar createCalendar(TimeZone zone, Locale aLocale)

这个方法  这个方法接收两个参数,一个是时区,一个是地区。

Locale 表示地区,每一个Locale对象都代表了一个特定的地理、政治和文化地区。

在java中用java.util.TimeZone类来表示一个时区。每一个时区都一个id,可以利用TimeZone.getAvailableIDs()这个方法获取所有的id。

3)DateFormat

DateFormat用来在Date对象和字符串之间进行转化。

  比如,我有一个date,想转成2013年12月01日这种样式,或者想从2013-12-01这个字符串转成一个date对象,都可以利用DateFormat类。

  DateFormat虽然是个抽象类,我们在日常中可以使用它的子类SimpleDateFormat类,虽然DateFormat还是提供了一些static方法构建DateFormat实例,可以进行简单的转换日期功能。但我们只说SimpleDateFormat

  我们如果用DateFormat进行转换格式,只能用它规定的几种格式进行转换,非常的不直观,从字面我们看不出来从Date转出来的日期是怎样的格式。

  但是如果用SimpleDateFormat就不一样了,在构造SimpleDateFormat我们可以直接传一个规定格式,只要这个规定格式符合要求且是合理的,就可以对Date和字符串进行转换了。

	/*
		 	 * Date format (Date date)
		 	 * 功能:将时间对象按照指定格式转换成字符串
		 	 * */
			Date now4=new Date();
			System.out.println(now4);
			//传入当前时间Fri Nov 26 19:31:04 CST 2018
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");
			//将其转换成"yyyy-MM-DD HH:mm:ss"格式输出 y->年  M->月 D->日 H->时 m->份 s->秒
			//此处格式区分大写小 
			String s=sdf.format(now4);
			System.out.println(s);
			//输出:2018-11-26 19:31:04
			
			
			/*
			 * Date parse (String s)throws ParseExcetion
			 * 功能:将字符串按照定义的格式转成日期对象
			 * 需要处理异常
			 */
			SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/DD HH/mm/ss");
			String S = "1986/11/08 07/00/00";
			try {
				Date d = sdf1.parse(S);
				System.out.println(d);
				//输出:Wed Jan 08 07:00:00 CST 1986
			} catch (Exception e) {
				e.printStackTrace();
			}

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值