StackOverflow 社区,
我目前正在处理我的新项目,我是 Java 和 Android Studio 的新手。
我用两个 Calendar
变量编写了自己的 Entry
类。
是否有更短更清晰的方法来创建新的 Entry
对象,如以下代码所示?
//MainActivity.java
//....
private ArrayList<Entry> initEntrys() {
ArrayList<Entry> list = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
Calendar mStartDate = calendar;
Calendar mEndDate = calendar;
mStartDate.set(2019, 12, 20, 7, 0);
mEndDate.set(2019, 12, 20, 10, 0);
list.add(new Entry(mStartDate, mEndDate));
return list;
}
任何帮助将不胜感激。 :)
最佳答案
tl;dr
切勿使用遗留的日期时间类,例如 Calendar
。 仅使用 java.time 类。
对于具有时间但缺少时区或与 UTC 的偏移量的日期,请使用 java.time.LocalDateTime
类。
LocalDateTime.of( 2019 , 12 , 20 , 7 , 0 ) // year, month, day , hour , minute.
避免遗留日期时间类
永远不要使用Calendar
。那个类很糟糕,它的设计有缺陷。它在多年前被 JSR 310 中定义的现代 java.time 类所取代。
java.time
与遗留类相比,java.time 类在设计上是不可变的,因此是线程安全的。
我们不是通过 new
使用构造函数,而是通过调用静态工厂方法(例如 LocalDateTime.of
)来实例化 java.time 对象。 .
一刻钟
如果你在没有 time zone 的情况下有意识地工作或 offset-from-UTC , 使用 LocalDateTime
对象。
LocalDateTime start = LocalDateTime.of( 2019 , 12 , 20 , 7 , 0 ) ; // Passing year, month, day , hour , minute. The second and fractional-second both default to zero.
LocalDateTime stop = LocalDateTime.of( 2019 , 12 , 20 , 10 , 0 ) ;
瞬间
如果您试图表示时刻、时间轴上的特定点,那么 LocalDateTime
是错误的类。
对于跟踪时刻,您需要时区的上下文(或者更不理想的是,与 UTC 的偏移量)。为此,使用 ZonedDateTime
正如在 Answer by CrackerGen 中看到的那样.
关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .
Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。
您可以直接与您的数据库交换java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.*
类。
从哪里获得 java.time 类?
- > Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 , 以及后来的 - 标准 Java API 的一部分,带有 bundle 实现。
- Java 9 添加了一些次要功能和修复。
- > Java SE 6和 Java SE 7
- 在 ThreeTen-Backport 中,大部分 java.time 功能都向后移植到 Java 6 和 7。 .
- > Android
- 更高版本的 Android bundle 实现 java.time 类。
- 对于早期的 Android (<26),ThreeTenABP项目改编ThreeTen-Backport (上文提到的)。参见 How to use ThreeTenABP… .
关于java - 在 Android 中使用 `Calendar` 指定日期时间范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59505909/