Java/Android中时间类功能的替换和DateTime类的理解
我正在开发一个Android应用程序,它大量使用类来进行时间/日期转换和计算 现在这个类被弃用了,我要求将使用它的所有助手方法替换为其他方法 我对Date/Time类的工作原理有很多误解,每个类在处理时间的方式上都有很大的不同 同时,it本身也有很多复杂性:Java/Android中时间类功能的替换和DateTime类的理解,java,android,date,datetime,time,Java,Android,Date,Datetime,Time,我正在开发一个Android应用程序,它大量使用类来进行时间/日期转换和计算 现在这个类被弃用了,我要求将使用它的所有助手方法替换为其他方法 我对Date/Time类的工作原理有很多误解,每个类在处理时间的方式上都有很大的不同 同时,it本身也有很多复杂性: Unix时间戳(从1970年1月1日起的秒数,32位格式) UTC:是时间标准,它比GMT00精确 格林威治时间:是格林威治时间,我们可以根据它计算时区 等等 我对Time/Date类如何基于时间和日期的大范围差异来操纵时间和日期有很多
- Unix时间戳(从1970年1月1日起的秒数,32位格式)
- UTC:是时间标准,它比GMT00精确
- 格林威治时间:是格林威治时间,我们可以根据它计算时区
Time dayTime = new Time();
dayTime.setToNow();
// we start at the day returned by local time. Otherwise this is a mess.
int julianStartDay = Time.getJulianDay(System.currentTimeMillis(), dayTime.gmtoff);
我该怎么替换它呢?它的好处是什么
白昼.gmtoff
此外,我是否应该使用:
- 格雷戈里安卡伦达类
- SimpleDataFormat类
- 日历类
- 还有别的
- 这不是一个可靠的答案,但我在为Android应用程序解析MySql中的日期时使用了以下代码。我还发现Java Date类令人困惑,因为它大多数都不推荐使用,但我发现该类可以满足我的大多数需求
一件好事是
new gregorianalendar()代码>将实例化到当前时间。您可以使用另一个构造函数来指定特定的时区
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2012-12-13 14:54:30"); // mysql datetime format
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
System.out.println(calendar.getTime());
int month = calendar.get(Calendar.MONTH);
System.out.println(month);
乔达时间
是的,日期-时间工作通常令人惊讶地困惑和棘手
是的,您应该使用您列出的类以外的其他类。与早期版本的Java捆绑在一起的旧日期时间类非常混乱。他们是业界勇敢地承担这一难题的第一批人。但最终他们失败了,证明在设计和实现上都存在缺陷。我指的是java.util.Date/.Calendar、java.text.SimpleDateFormat以及它们的兄弟姐妹。避开它们
甚至Sun和Oracle也放弃了这些旧类,同意用java 8及更高版本中内置的新java.time框架取代它们。这个新框架的灵感来自Joda Time的成功
不要使用旧类,而是将库添加到Android项目中
我记得有一些Joda Time的替代包装专门为Android提供,以解决Android中关于缓慢加载的一些限制。我会在部署时对此进行研究,但要开始使用,您可以使用常规的Joda Time jar
我不会在这里显示任何示例代码,因为您可以通过搜索StackOverflow找到数百个示例
java.sql
对于数据库工作,请使用java.sql包中的类:java.sql.Timestamp、.Time和.Date类
有朝一日,JDBC驱动程序将被更新,以直接使用新的java.time类型。但是直到那一天,在Java8和更高版本中使用为那些旧类添加的新转换方法
sql类仅用于从数据库中获取数据。对于编码的所有其他方面,请使用java.time类
时区
至于时区,你的文章并不十分清楚你的困惑的确切性质
所有日期-时间处理都是从内部作为计数完成的。旧类和java.time都使用了1970年第一个时刻的纪元。旧类以毫秒计;时间以纳秒计
对于UTC和,出于商业应用程序的实际目的,它们是相同的。如果你真的想知道,请阅读维基百科。但在常规Java工作中,您可以将它们视为同义词
所有其他时区都被定义为/GMT。我们需要地球上的一些任意点来定义为分界线,即参考点。出于历史原因,位于英国伦敦格林威治的皇家天文台成为了这一点。中的时钟设置为比该时间提前五个半小时,而中的时钟设置为比该时间晚五(或四)小时
时间是时间线上的一个时刻,总是以UTC为单位,基本上只是历元的一个计数。你可以把时间看作是一个瞬间加上一个时区,一个ZoneId
。如果我们通过调用Instant.now
来获取当前时刻,并通过应用加尔各答、巴黎和蒙特勒尔的时区来调整当前时刻,我们将得到三个ZoneDateTime
对象。所有三个都代表相同的同时时刻,并且每个都包含来自内部的相同计数。它们的不同之处在于它们显示出不同的颜色
请记住,时区是UTC偏移量和处理异常(如夏令时(DST))的规则集合的组合。这些规则包括过去、现在和未来的调整,这些调整需要在UTC补偿调整之外进行。除DST外,其他调整包括,例如,在第二次世界大战期间,欧洲各地改变了各种计时做法