Android中Calendar与Date的区别以及消除时区对日期操作影响的方法

在Android中的日期操作常用的有三种方式,分别是:

Date类型

Calendar类型

Unix时间戳

其中,Unix时间戳在计算上最为方便和灵活,效率也高;而Date和Calendar则在一些具体的日期计算上更为便利。其中,在进行日期转化的时候,经常会用到SimpleDateFormat类来进行格式化,包括将特定格式字符串转化为Date对象,以及将Date对象格式化为特定格式字符串。

首先来比较一下Date和Calendar的不同。使用过日期转Unix时间戳的人很有可能会遇到一个问题,那就是Date或者SimpleDateFormat获得的时间戳跟Calendar获得的时间戳有差值,使用中国时区的话这个差值应该是28800000ms,也就是8小时。显然,这8个小时的差别就是由于时区产生的,而如果在开发与日期时间紧密相关的程序时忽略了这一时差,很可能就会产生许多匪夷所思的误差和结果。在Android中,Calendar是能够自动根据手机所设置的时区来调整时间戳的,也就是该时区真实的时间戳;Date和SimpleDateFormat获得的时间戳则不考虑时区,而是获取标准的GMT时间戳。这两者的时间戳差可以通过使用TimeZone.getDefault().getRawOffset()方法来取得。那么现在就可以很容易地得出解决Date、SimpleDateFormat与Calendar在时间戳上的时差问题的方法,简单描述如下:

Calendar calendar = Calendar.getInstance();//获取当前日历对象

long unixTime = calendar.getTimeInMillis();//获取当前时区下日期时间对应的时间戳

long unixTimeGMT = unixTime - TimeZone.getDefault().getRawOffset();//获取标准格林尼治时间下日期时间对应的时间戳

Date date = new Date();//获取当前日期对象

unixTimeGMT = unixTime = date.getTimeInMillis();//获取当前时区下日期时间对应的时间戳

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置格式

String dateString = "2010-12-26 03:36:25";//设定具有指定格式的日期字符串

unixTimeGMT = unixTime = format.format(date);//获取当前时区下日期时间对应的时间戳

显然,在开发中必须让时间戳统一,这样才能避免许多尴尬的问题。那么在实际开发过程中,究竟应该是使用手机指定时区的时间戳还是标准时间戳呢?个人认为应该使用标准时间戳,因为用户很有可能会有更改时区的操作出现,如果使用对应时区的时间戳,并且时间戳作为某种标记量存入了数据库,那么一旦时区发生改变,已存数据将会与当前时区设置产生问题;而使用标准时间戳则可以避免这一问题,因为通过程序可以很容易地将时间戳转化为标准时间戳,并且标准时间戳是固定的,这样就能保证即使在修改了时区的情况下,也能正确处理日期时间。

二. Android开发中 获取当前Android的年月日时分秒的时间

Android的文件有建议用Time代替Calendar。用Time对CPU的负荷会较小。在写Widget时特别重要。

Time t=new Time(); // or Time t=new Time("GMT+8");

android 一年日历,android中Calendar与Date的区别 转自网络相关推荐

  1. Calendar中 DAY_OF_MONTH,  DAY_OF_YEAR,  DATE 的区别

    Calendar中 DAY_OF_MONTH,  DAY_OF_YEAR,  DATE 的区别 caltest.add(Calendar.DATE,1); caltest.add(Calendar.D ...

  2. Calendar中 DAY_OF_MONTH, DAY_OF_YEAR, DATE 的区别

    Calendar中 DAY_OF_MONTH, DAY_OF_YEAR, DATE 的区别 如果只是的add方法执行,结果都一样,因为都是将日期+1就没有区别 caltest.add(Calendar ...

  3. android 仿三星周日历,Android Calendar Provider(日历事件)

    这篇文章的目的 写这篇文章的目的,主要是为了记录在日历事件中遇到的2个比较少见,在网上比较难查找资料的问题. 应用背景: 在应用中通过ContentProvider操作系统日历,向系统日历中添加.更新 ...

  4. android+高仿+日历,Android开源的精美日历控件,热插拔设计的万能自定义UI

    UI框架应该逻辑与界面实现分离,该日历控件使用了热插拔的设计 ,简单几步即可实现你需要的UI效果,热插拔的思想是你提供你的实现,我提供我的插座接口,与自定义Behavior是一样的思想. 听说第一页无 ...

  5. android+高仿+日历,android高仿钉钉和小米的自定义日历控件(支持阴历和阳历,左右无限翻页viewpager)...

    收藏 0 简介 这是一个高仿钉钉和小米的日历控件,支持快速滑动,界面缓存.想要定制化UI,使用起来非常简单,就像使用ListView一样 一些特点: 可以自定义日历控件UI 支持快速滑动 支持农历和阳 ...

  6. java电脑日历_Java中calendar对万年历的制作(同步电脑上的万年历日期格式)

    Java编程中calendar对万年历的制作教程 使用到的方法: 1.日期类型的转换: String----->Date String str = "2020年05月27日 20:28 ...

  7. Java 中Calendar、Date、SimpleDateFormat学习总结

    在之前的项目中,经常会遇到Calendar,Date的一些操作时间的类,并且总会遇到时间日期之间的格式转化问题,虽然做完了但是总是忘记,记不清楚,每次还都要查找资料.今天总结一下,加深印象. Cale ...

  8. JAVA中Calendar与Date类型互转

    (1) Calendar转化为Date Calendar cal=Calendar.getInstance(); Date date=cal.getTime(); (2) Date转化为Calenda ...

  9. android 一周日历,(Android)获取一周的第一天

    你好,如果你需要得到当周的第一天"星期一" Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DA ...

最新文章

  1. 查看数据库中有哪些活动的事务,对应的会话id,执行的语句
  2. 《精通Wireshark》—第2章2.6节总结
  3. .net core mvc 区域路由设置(配置)
  4. 青少年学python第六节_青少年学Python(第2册)
  5. 【数学与算法】如何通俗的理解概率密度函数
  6. iOS多线程的初步研究(十)-- dispatch同步
  7. 爱了!爱了!Markdown 必备组合神器!
  8. eclipse编译java项目class文件_动态编译 Java 代码以及生成 Jar 文件
  9. html asterisk 电话,Asterisk 常见问题
  10. JavaWeb——关于RequestDispatcher的原理
  11. HDU 4870 Rating(高斯消元 )
  12. django配置文件
  13. 慎重!物联网时代情趣用品真的适合联网么?
  14. PMP第十三章:项目相关方管理
  15. 作为产品经理为什么选择开源GIS
  16. comsol 超声声场模拟_COMSOLMultiphysics模拟室内的声场特征模态.PDF
  17. Windows系统日志分析工具-- Log Parser
  18. 查看linux vnc用户名,VNC远程连接Linux
  19. C语言 生成随机数 分析给定范围的随机数生成公式
  20. CentOS快速安装、配置Web服务器(Apache)

热门文章

  1. 雷军 1994 年写的代码,像诗一样优雅,不服不行~
  2. 如何在Windows中将应用程序添加到快速启动菜单
  3. 干涉测量技术的应用_光学三维测量技术及应用(2)
  4. 数据科学家定位和职业规划
  5. TCP 第三次握手失败
  6. com.mysql.cj.exceptions.ConnectionIsClosedException: No operations allowed after connection closed.
  7. 游戏盾是怎么防御攻击的
  8. 戴尔笔记本电脑重装win10开机蓝屏进不去系统怎么办?
  9. Jim Highsmith
  10. 远程桌面计算机断网,win10系统远程桌面连接一会自动断开的详细技巧