看其他东西看烦了,就翻着看看java基础,发现好多东西学了之后没有整理出来,现在再去看的话觉得好陌生,仿佛从来没看过一样……,今天就来总结一下java里面对于时间与日期的处理这部分的内容
在这里就不详细介绍很早之前的时间度量方式了,感兴趣的小伙伴可以找找资料了解一下,现在就简单介绍一下Date和Calendar吧…
时间轴上瞬间的Date
我们知道,想要取得系统时间,具体来说有两种方法:
方法一是System.currentTimeMillis()方法,这个返回的是long类型的整数,代表的是1970年1月1日0时0分0秒0毫秒至今经过的毫秒数。
方法二是使用Date实例来取得系统时间描述,不过,两种方法并没有什么大区别,Date也是偏向机器的时间观点.
可以看出,这两种方法取得的是机器的时间观点,代表时间轴上的某一瞬间,但是需要思考的是,这一长串毫秒数对与我们人类的阅读有什么意义???
package com.Datetime;
import java.util.Date;
import static java.lang.System.currentTimeMillis;
/**
* Created by dongmengyuan on 17-8-9.
*/
public class DateDemo {
public static void main(String[] args) {
Date date1 = new Date(currentTimeMillis());
Date date2 = new Date();
System.out.println(date1.getTime());
System.out.println(date2.getTime());
}
}
诺,来看看计算机的回复:
emmmm…
无疑是没有什么意义的,这就好比,你问计算机现在几点了,计算机给你返回一长串数字,想想都可怕…
格式化时间日期的DateFormat
通过上面的简单介绍,可以发现,有关字符串时间格式的处理已经不再是Date的职责了,所以,这重任就落到了java.text.DateFormat身上。
DateFormat是一个抽象类,他的操作类是java.text.SimpleDateFormat。
我们有两种方式来操作它,第一种是直接构建SimpleDateFormat的实例,另一种是使用DateFormatgetDateInstance(),getTimeInstance(),getDateTimeInstance()等静态方法,用简便方式按不同需求取得SimpleDateFormat实例。
现在先来看看如何通过DateFormat的各种静态方法来对字符串时间进行格式化操作。
package com.Datetime;
import java.util.*;
import static java.text.DateFormat.*;
/**
* Created by dongmengyuan on 17-8-15.
*/
public class DateFormatDemo {
public static void main(String[] args) {
Date date = new Date();
dateInstanceDemo(date);
timeInstanceDemo(date);
dateTimeInstanceDemo(date);
}
static void dateInstanceDemo(Date date)
{
System.out.println("getDateInstance() demo:");
System.out.printf("\t: %s%n",getDateInstance(LONG).format(date));
System.out.printf("\t: %s%n",getDateInstance(SHORT).format(date));
}
static void timeInstanceDemo(Date date)
{
System.out.println("getTimeInstance() demo:");
System.out.printf("\t: %s%n",getTimeInstance(LONG).format(date));
System.out.printf("\t: %s%n",getTimeInstance(MEDIUM).format(date));
System.out.printf("\t: %s%n",getTimeInstance(SHORT).format(date));
}
static void dateTimeInstanceDemo(Date date)
{
System.out.println("getDateTimeStance() demo:");
System.out.printf("\t: %s%n",getDateTimeInstance(LONG,LONG).format(date));
System.out.printf("\t: %s%n",getDateTimeInstance(SHORT,MEDIUM).format(date));
System.out.printf("\t: %s%n",getDateTimeInstance(SHORT,SHORT).format(date));
}
}
格式化结果是:
getDateInstance(),getTimeIntance(),getDateTimeInstance()等静态方法主要是用来取得不同详细程度的日期时间。
再来试试直接构建SimpleDateFormat的实例的方法
package com.Datetime;
import java.util.*;
import java.text.*;
/**
* Created by dongmengyuan on 17-8-15.
*/
public class CurrentTime {
public static void main(String[] args) {
DateFormat dateFormat = new SimpleDateFormat(args.length == 0 ? "EE-MM-dd--yyyy" : args[0]);
System.out.println(dateFormat.format(new Date()));
}
}
效果如下:
很容易看出,使用这种直接构建SimpleDateFormat实例的好处就是可以使用模式字符串自定义格式。
处理时间日期的Calendar
如果想要取得某个时间日期信息,或是下想要对时间日期进行操作,可以使用Calendar实例。
Calendar是一个抽象类,取得Calendar的实例后,可以使用getTime()取得Date实例,如果想要取得年月日等日期时间字段,可以使用get()方法并指定Calendar上的字段枚举常数,如:
System.out.println(Calendar.YEAR); //2017
System.out.println(Calendar.MONTH); //7
System.out.println(Calendar.DATE); //15
在这里需要注意的是:得到的数字是对应至Calendar在月份上的列举值,但是列举值的一月是从0数字开始,所以得到的月份数字比实际的月份在数值上小一
public final static int JANUARY = 0;
public final static int FEBRUARY = 1;
...
...
public final static int DECEMBER = 11;
如果要设定时间日期等字段,不要对Date设定,应使用Calendar,同样,月份部分使用枚举常数设定。
如下:
Calendar calendar = Calendar.getInstance();
calendar.set(2017,Calendar.AUGUST,15);
System.out.println(Calendar.YEAR); //2017
System.out.println(Calendar.MONTH); //8
System.out.println(Calendar.DATE); //15
在取得Calendar实例后,可以使用add()方法来改变Calendar的时间,如下:
//Calendar的时间加1个月
Calendar.add(Calendar.MONTH,1);
//Calendar的时间加3小时
Calendar.add(Calendar.HOUR,3);
//Calendar的时间减2年
Calendar.add(Calendar.YEAR,-2);
如果Calendar设定的时间是2014/2/28,(非闰年),Calendar.add(Calendar.DATE,1)的结果是2014/3/1。——计算结果是下一天应有的日期。
但是如果我只想针对日期中某个字段计算呢?
这时应该用roll()方法。
例如,对于2014/2/28,想要只改变日字段,我们就选择使用roll()方法,Calendar.roll(Calendar.DATE,1)的结果是2014/2/1,可以看出也只是处理了日字段部分,因为2014年的2月没有29,所以实际上回到了1日.
设定Timezone
在前面的示例中,都没有涉及到使用时区信息,这样的话是使用默认时区的,我们可以使用java.util.Timezone的getDefault()来取得默认时区信息,如:
package com.Datetime;
/**
* Created by dongmengyuan on 17-8-15.
*/
import java.util.TimeZone;
public class TimezoneDemo {
public static void main(String[] args) {
TimeZone timezone = TimeZone.getDefault();
System.out.println(timezone.getDisplayName());
System.out.println("\t时区ID:" + timezone.getID());
System.out.println("\t日光节约时数:" + timezone.getDSTSavings());
System.out.println("\tUTC偏移毫秒数:" + timezone.getRawOffset());
}
}
结果:
当然,你要是想取得指定地区的TimeZone实例,可以使用ID字符串,如:
TimeZone taipeiTz = TimeZone.getTimeZone("Asia/Taipei");
TimeZone copenhagenTz = TimeZone.getTimeZone("Europe/Copenhagen");
嗯,这块东西大概就是这样啦,总结一下,方便回忆!