android 日期显示类,Android时间日期类小结

1.Calendar

Calendar类有个类方法叫做getInstance()。这个方法返回一个Calendar子类的具体实现类的实例(Calendar是一个抽象类,它的实现类是

GregorianCalendar),这个实例是时区敏感的,它会随着系统的时区变化而变化,同时,获得的这个实例已经被初始化,可以直接使用。获得Calendar的实例:

Calendar rightNow = Calendar.getInstance();

Calender是一个抽象类,使用getInstance返回的是一个GregorianCalendar类的实例。

使用毫秒设置rightNow的时间:

setTimeInMillis(111);

Calendar,Date,Time类之间的转换

Calender可以方便的和Date,Time等类做转换,比如,下面定义的方法可以把Date转为Calendar:

/**

* Sets the time of this {@code Calendar}.

*/

public final void setTime(Date date) {

setTimeInMillis(date.getTime());

}

反向转换:        Date date = new Date();        date.setTime(before.getTimeInMillis());其实,这些转换都是使用毫秒进行的,毫秒就是一个长整数了,它不涉及格式的问题,因此Time,Date,Calendar都

可以直接使用毫秒相互转化,非常方便,例子如下:

Calendar->Time:

Calendar calendar = Calendar.getInstance();

Time time = new Time();

time.set(calendar.getTimeInMillis());Time->Calendar:

Calendar calendar = Calendar.getInstance();

Time time = new Time();

calendar.setTimeInMillis(time.toMillis(true));Time类的toMillis方法后面会有介绍。

lenient模式

Calendat类支持Lenient模式,所谓leninet模式就是容错模式,它的意思是说,如果用户设置的某些字段值超出了合理的范围,比如一月32号,那么Calender会自动把它转为2月1号。lenient模式可以通过setLenient(true/false)来使能或者关闭。如果leninet模式被关闭,那么当输入一个超出正常范围的值的时候,就会出发一个out_of_range的异常。

注意:Calender等时间类的月份都是从零开始,比我们习惯上的月份小一个月份,不知道为何要这么设计,之前就因为这一点跳过坑。

2.Time

android.text.format.Time包中的Time类是android平台的一个时间类,但是这个类目前已经不建议使用了,取而代之的是

GregorianCalendar类。Time和Calendar功能类似,据说Time对CPU的占有率更低。

创建一个Time:

Time time = new Time();这样创建的Time使用默认的时区,并且会被初始化为Jan 1, 1970.

设置time为当前时间:

time.setToNow();使用毫秒设置time的时间:

time.set(1212);toMillis(false)与toMillis(true)的区别:

其区别在于是否支持夏令时。

夏令时

关于夏令时,我的理解是这样的:为了节约能源,人为的把夏季的时间调的比实际的早,从而使人们早起的一种策略。举个例子来说,假如冬天早晨8点天才亮,而夏季7点天就亮了,如果我还是让大家8点起床,那岂不浪费了一个小时的阳光?所以我就把时间调早了一个小时,这样大家还是8点起床,但是其实你已经早起了一个小时了。使用这种欺骗的方式迫使人们早睡早起,从而达到解决能源的目的。一般夏令时就是在夏季的时候把时间调早一小时。

获取毫秒:

time.toMillis(false);或者time.toMillis(true);

3.SimpleDateFormat

SimpleDateFormat extends DateFormat

它继承自DataFormat,除了具备DateFormat的所有功能为,它还添加了一些非常方便的功能。

在创建SimpleDateFormat的时候,我们就可以给它指定各种格式,比如:

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");

然后就可以得到该格式的字符串:

String aaa = dateFormat.format(new Date());

format方法需要一个Date的实例,使用Calendar的时候,它的getTime()方法可以返回一个Date实例。

SimplerDateFormat可以使用'MM','dd','yy'构造任意格式,比如:MM-dd-yy,dd-MM-yy,dd/MM/yyyy等等,因此,使用它格式化时间

日期非常方便。

以下为一些参考格式:

yyyy-MM-dd 1969-12-31

yyyy-MM-dd 1970-01-01

yyyy-MM-dd HH:mm 1969-12-31 16:00

yyyy-MM-dd HH:mm 1970-01-01 00:00

yyyy-MM-dd HH:mmZ 1969-12-31 16:00-0800

yyyy-MM-dd HH:mmZ 1970-01-01 00:00+0000

yyyy-MM-dd HH:mm:ss.SSSZ 1969-12-31 16:00:00.000-0800

yyyy-MM-dd HH:mm:ss.SSSZ 1970-01-01 00:00:00.000+0000

yyyy-MM-dd'T'HH:mm:ss.SSSZ 1969-12-31T16:00:00.000-0800

yyyy-MM-dd'T'HH:mm:ss.SSSZ 1970-01-01T00:00:00.000+0000

4.关于时区

在使用时间/日期类的时候,一定要注意时区的概念,Calendar类是一个时区敏感类,它会自动过去系统时区。但有些时候,我们可

能希望获取GTM或者UTC时间,如果使用Calender类的话需要减去时区偏移:

before.getTimeZone().getOffset(System.currentTimeMillis());

before是一个GregorianCalendar类的实例,通过它的getTimeZone方法可以获取一个TimeZone的实例,这个实例可以计算出时区偏移。

GTM和UTC可以认为是一个东西,他们都表示伦敦当地的时间。

Time类可以在构造的时候就指定它的时区,其构造函数定义如下:

/**

* Construct a Time object in the timezone named by the string

* argument "timezone". The time is initialized to Jan 1, 1970.

* @param timezoneId string containing the timezone to use.

* @see TimeZone

*/

public Time(String timezoneId) {

if (timezoneId == null) {

throw new NullPointerException("timezoneId is null!");

}

initialize(timezoneId);

}

比如,创建一个时区为0的Time实例: Time curTime = new Time("GTM+0");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值