时间日期类

1、Date类介绍

在开发中经常会用到时间和日期,前面学习System类时,其中currentTimeMillis方法可以返回当前时间的毫秒值,可是这些数据看起来很不清晰,怎么能让这些数据变的

很清晰,便于阅读呢?在查阅System类的currentTimeMillis方法时,其中让我们另请参见Date类,找到这个Date发现,类 Date 表示特定的瞬间,精确到毫秒。继续查阅

Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象。
  //获取当前时间的毫秒值

  long time = System.currentTimeMillis();
  //创建日期对象,把当前的毫秒值转成日期对象
  Date date = new Date(time);
  System.out.println(date);//结果:Wed Dec 11 16:42:06 CST 2013
可是将毫秒值转成日期后,输出的格式不利于我们阅读,继续查阅API,Date中有getYear、getMouth等方法,可以他们已经过时,继续往下查阅,看到了toString方法,

点开查阅原来是上面打印的date就是默认调用了这个toString方法,并且在这个方法下面还有让我们参见toLocaleString方法,点进去,这个方法又过时了,从 JDK 1.1

开始,由 DateFormat.format(Date date) 取代。
既然这个方法被DateFormat.format(Date date) 取代,那么就要去查阅DateFormat类。

2、DateFormat类介绍
查阅DateFormat类介绍:DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat

)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。
原来这个类可以帮我们完成日期和文本之间的转换。继续阅读API,DateFormat 可帮助进行格式化并解析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳

历),其代码可完全与语言环境的约定无关。要格式化一个当前语言环境下的日期,可使用某个静态工厂方法:
   myString = DateFormat.getDateInstance().format(myDate);
  //获取日期格式器对象,在获取格式器对象时可以指定风格,风格包括 FULL、LONG、MEDIUM 和 SHORT
  DateFormat format = DateFormat.getDateInstance(DateFormat.LONG);
  //对日期进行格式化
  String str_time = format.format(date);
  System.out.println(str_time);//结果:2013年12月11日


3、Calendar类介绍
我们可以通过Date获取到日期对象,使用DateFormat方法可以把日期进行格式化,可我们想获取当前日期对应的具体的年,具体的月,具体的日,等信息,怎么获取呢?
找到Date继续查阅,其中有getYear等方法,只是这些方法过时了,并且这些方法的描述中告诉我们参加Calendar类。
查阅Calendar类的API描述,发现原来Calendar类是专门用于描述日历的类,它中维护了一个map集合,在这个集合中存放着所有和日期相关的信息。

public class DateDemo {
 public static void main(String[] args) {
  //获取日历对象
  Calendar c = Calendar.getInstance();
  System.out.println(c);//打印出了一个map集合,其中描述日期的所有信息
  //获取年
  int year = c.get(Calendar.YEAR);
  //获取月,月是从0开始计算的,所以应该“+1”
  int mouth = c.get(Calendar.MONTH)+1;
  //获取日
  int day = c.get(Calendar.DAY_OF_MONTH);
  //获取星期,由于老外们把星期日当作一周的第一天,所有星期日 返回对应的数字为1
  String week = getWeek(c.get(Calendar.DAY_OF_WEEK));
  System.out.println(year+"年"+mouth+"月"+day+"日"+week);
  
 }

 public static String getWeek(int i) {
  if(i<0 || i>7){
   throw new RuntimeException(i+"没有对应的星期");
  }
  String[] weeks = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
  return weeks[i];
 }
}


4、日期练习
将毫秒值转成 指定的日期的格式   xxxx年xx月xx日   hh:mm:ss
//1,毫秒值time--->Date
Date date = new Date(time);
//2,通过日期时间格式器对象DateFormat对日期对象进行格式化(日期--->文本字符串)
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
String str_time = format.format(date);
System.out.println(str_time);


将"2014-9-19"转成日期对象。
之前有做过,将一个日期对象转成日期文本字符串这个称之为格式化。现在要做的是文本--->日期对象:解析。这些都是DateFormat中的功能。不同日期风格的文本对应

不同的格式器。

public static void main(String[] args) throws ParseException {
  String str_date = "2014年9月19日";
  //日期格式器。DateFormat
  DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
  Date date = dateFormat.parse(str_date);
  System.out.println(date);
  //这种格式在给定的四种风格中不存在。怎么解析呢?只能使用子类SimpleDateFormat的方法,
  //1,构造函数明确特定风格,2,applyPattern 方法来修改格式模式
  str_date = "2014/9/19 09--29--45";
  DateFormat dateFormat2 = new SimpleDateFormat("yyyy/MM/dd hh--mm--ss");
  Date date2 = dateFormat2.parse(str_date);
  System.out.println(date2);
 }

 

计算"2013-4-25"到"2013年7月29日"到底有多少天?
思路:
1,到底有多少天?相减的过程。
2,字符串也不能相减啊,毫秒值可以相减。
3,怎么获取毫秒值呢?毫秒值-->日期对象, 日期对象-->毫秒值。
4,怎么获取日期对象呢?需要将字符串文本--解析-->日期对象。

public class DateTest2 {
 public static void main(String[] args) throws ParseException {
  
  String str_date1 = "2013-4-25";
  String str_date2 = "2013年7月29日";
  //需要定义两个模式。一个解析str_date1,一个解析str_date2。
  int style_1 = DateFormat.MEDIUM;//默认风格。
  int style_2 = DateFormat.LONG;//默认风格。
  
  int days = getDays(str_date1,str_date2, style_1,style_2);
  System.out.println("days="+days);
 }

 private static int getDays(String str_date1, String str_date2,
   int style_1, int style_2) throws ParseException {
 
  //1,根据给定风格创建格式器对象。
  DateFormat format_1 = DateFormat.getDateInstance(style_1);
  DateFormat format_2 = DateFormat.getDateInstance(style_2);
  
  //2,对文本进行解析。
  Date date_1 = format_1.parse(str_date1);
  Date date_2 = format_2.parse(str_date2);
  
  //3,获取日期对象毫秒值。
  long time_1 = date_1.getTime();
  long time_2 = date_2.getTime();
  
  //4,相减。
  long time = Math.abs(time_1 - time_2);
  int day = (int)(time/1000/60/60/24);
  return day;
 }
}


5、获取给定年份的2月有多少天?

public class DateTest3 {
 public static void main(String[] args) {
  for (int year = 2000; year <= 2020; year++) {
   show(year);
  }
 }
 public static void show(int year) {
  Calendar c = Calendar.getInstance();//
  // 有获取有设置 set
  c.set(year, 2, 1);
  // 时间是连续的,3月1日的前一天就2月的最后一天,知道2月份的天数。
  c.add(Calendar.DAY_OF_MONTH, -1);
  int year1 = c.get(Calendar.YEAR);
  int month = c.get(Calendar.MONTH) + 1;
  int day = c.get(Calendar.DAY_OF_MONTH);
  String week = getCnWeek(c.get(Calendar.DAY_OF_WEEK));
  // 打印信息中年月日等相关信息都在这里。获取指定字段的值就哦了。
  System.out.println(year1 + "年" + month + "月" + day + "日  " + week);
 }
 public static String getCnWeek(int i) {
  if (i < 0 || i > 7) {
   throw new RuntimeException(i + "没有对应的星期");
  }
  // 定义表。
  String[] weeks = { "", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
  return weeks[i];
 }
}


==============================================

希望能与更多的java程序员共同学习

扣扣联系:2531977855


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值