Java 在Android中使用“日历”指定日期时间范围

Java 在Android中使用“日历”指定日期时间范围,java,android,datetime,arraylist,calendar,Java,Android,Datetime,Arraylist,Calendar,社会各界, 我目前正在做我的新项目,我是Java和Android Studio的新手。 我用两个日历变量编写了自己的Entry类。 是否有一种更短更干净的方法来创建新的条目对象,如下面的代码所示 //MainActivity.java //.... private ArrayList<Entry> initEntrys() { ArrayList<Entry> list = new ArrayList<>(); Cale

社会各界,

我目前正在做我的新项目,我是Java和Android Studio的新手。 我用两个日历变量编写了自己的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;博士 切勿使用传统日期时间类,如日历。仅使用java.time类

对于包含一天中某个时间但缺少时区或UTC偏移量的日期,请使用类

避免遗留日期时间类 不要使用日历。那门课很糟糕,设计上有缺陷。多年前,JSR310中定义的现代java.time类取代了它

java.time 与遗留类相比,java.time类在设计上是不可变的,因此是线程安全的

我们通过调用静态工厂方法来实例化java.time对象,而不是将构造函数用于new

一刻也不 如果您有意识地在没有或上下文的情况下工作,请使用对象

片刻 如果您试图表示时间轴上的时刻、特定点,那么是错误的类

对于跟踪时刻,您需要时区的上下文,或者更确切地说,需要UTC的偏移量。为此,请使用中所示的

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类

从哪里获得java.time类

、和更高版本-标准Java API的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大多数java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。 对于早期的Android tl;博士 切勿使用传统日期时间类,如日历。仅使用java.time类

对于包含一天中某个时间但缺少时区或UTC偏移量的日期,请使用类

避免遗留日期时间类 不要使用日历。那门课很糟糕,设计上有缺陷。多年前,JSR310中定义的现代java.time类取代了它

java.time 与遗留类相比,java.time类在设计上是不可变的,因此是线程安全的

我们通过调用静态工厂方法来实例化java.time对象,而不是将构造函数用于new

一刻也不 如果您有意识地在没有或上下文的情况下工作,请使用对象

片刻 如果您试图表示时间轴上的时刻、特定点,那么是错误的类

对于跟踪时刻,您需要时区的上下文,或者更确切地说,需要UTC的偏移量。为此,请使用中所示的

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类

从哪里获得java.time类

、和更高版本-标准Java API的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大多数java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。 对于早期的Android我将尝试使用类覆盖时间分区日期来完成

我在示例中使用了UTC时区,但您可以使用所需的适当时区进行自定义

LocalDateTime ldtStart = LocalDateTime.of( 2019 , 12 , 20 , 7 , 0 , 0 , 0 ) ;
ZonedDateTime ldtZonedStart = ldtStart.atZone(ZoneId.systemDefault());
ZonedDateTime utcZonedStart = ldtZonedStart.withZoneSameInstant(ZoneOffset.UTC);


LocalDateTime ldtStop = LocalDateTime.of( 2019 , 12 , 20 , 10 , 0 , 0 , 0 ) ;
ZonedDateTime ldtStopZoned = ldtStop.atZone(ZoneId.systemDefault());
ZonedDateTime utcZonedStop = ldtStopZoned.withZoneSameInstant(ZoneOffset.UTC);
我将尝试通过使用该类覆盖时间分区日期来完成

我在示例中使用了UTC时区,但您可以使用所需的适当时区进行自定义

LocalDateTime ldtStart = LocalDateTime.of( 2019 , 12 , 20 , 7 , 0 , 0 , 0 ) ;
ZonedDateTime ldtZonedStart = ldtStart.atZone(ZoneId.systemDefault());
ZonedDateTime utcZonedStart = ldtZonedStart.withZoneSameInstant(ZoneOffset.UTC);


LocalDateTime ldtStop = LocalDateTime.of( 2019 , 12 , 20 , 10 , 0 , 0 , 0 ) ;
ZonedDateTime ldtStopZoned = ldtStop.atZone(ZoneId.systemDefault());
ZonedDateTime utcZonedStop = ldtStopZoned.withZoneSameInstant(ZoneOffset.UTC);

在执行mStartDate=calendar和mEndDate=calendar时,将它们指定给相同的引用。这意味着,两个对象都包含相同的内容,设置频率没有区别。@dan1st我只是想知道是否不能创建类似list的内容。addnew Entrynew Calendar2019,12,20,10,12,45,..您可以创建一个帮助器方法来为您工作。这是您认为最好的方法还是创建DateTime类?不要创建自己的date/time类。如答案中所述,使用java.time。在执行mStartDate=calendar和mEndDate=calendar时,将它们指定给相同的引用。这意味着,两个对象都包含sa
我很满意,设置频率没有什么区别。@dan1st我只是想知道是否不能创建类似列表的内容。addnew Entry新日历2019、12、20、10、12、45、,..您可以创建一个帮助器方法来为您工作。这是您认为最好的方法还是创建DateTime类?不要创建自己的date/time类。使用答案中解释的java.time。
LocalDateTime ldtStart = LocalDateTime.of( 2019 , 12 , 20 , 7 , 0 , 0 , 0 ) ;
ZonedDateTime ldtZonedStart = ldtStart.atZone(ZoneId.systemDefault());
ZonedDateTime utcZonedStart = ldtZonedStart.withZoneSameInstant(ZoneOffset.UTC);


LocalDateTime ldtStop = LocalDateTime.of( 2019 , 12 , 20 , 10 , 0 , 0 , 0 ) ;
ZonedDateTime ldtStopZoned = ldtStop.atZone(ZoneId.systemDefault());
ZonedDateTime utcZonedStop = ldtStopZoned.withZoneSameInstant(ZoneOffset.UTC);