java - 在 Android 中使用 `Calendar` 指定日期时间范围

标签 java android datetime arraylist calendar

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 中看到的那样.


Table of all date-time types in Java, both modern and legacy


关于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 类?

Table of which java.time library to use with which version of Java or Android


关于java - 在 Android 中使用 `Calendar` 指定日期时间范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59505909/

相关文章:

Android 输入法管理器获取只有数字的键盘

php - 2 个 mysql 格式化日期时间之间的周数

javascript - 用于解析工作时间字符串的正则表达式模式

java - 二维对象数组的 NullPointerException

java - Spring MVC 集成 Thymeleaf

java - 如何在字符串中查找 int、大写、小写、空格和数字

java - 在使用 Job Scheduler API 的作业服务中使用 GoogleApiClient - 缺少回调

java - 静态初始化器与实例初始化器与构造函数

android - Jenkins环境变量中的Android配置

MySQL TIMESTAMP 停止处理夏令时转换