【问题标题】:How to generate an aray of Date objects in Kotlin?如何在 Kotlin 中生成日期对象数组?
【发布时间】:2020-09-09 18:45:06
【问题描述】:

我想生成一个 Kotlin 样式的日期对象数组,从当前日期开始每 5 天递减一次以编程方式

{现在、5_days_ago、10_days_ago 等..}

private fun dateArray() : ArrayList<Date> {
    val date = Date()
    val date2 = Date(date.time - 432000000)
    val date3 = Date(date2.time - 432000000)
    val date4 = Date(date3.time - 432000000)
    val date5 = Date(date4.time - 432000000)
    val date6 = Date(date5.time - 432000000)
    val date7 = Date(date6.time - 432000000)
    val date8 = Date(date7.time - 432000000)
    val date9 = Date(date8.time - 432000000)
    val dateA = Date(date9.time - 432000000)
    return arrayListOf(date, date2, date3, date4, date5, date6, date7, date8, date9, dateA)
}

这种方式开销很大。我敢打赌 Kotlin 提供了一种优雅的方式?

【问题讨论】:

  • 您如何验证没有生成数组?调用构造函数绝对实例化一个对象。
  • 他说了什么!乍一看,该代码看起来是正确的。虽然我会检查您是否应该使用 DAY_OF_MONTH 而不是 DAY_OF_YEAR。此外,通常建议使用较新的 java.time 类——LocalDate、Instant 和 c——而不是旧的笨重的 java.util 类,例如 Date 和 Calendar。
  • @gidds 但是 09.09 , 04.09 , 30.08 , 25.08 , 20.08 , 15.08 , .... DAY_OF_MONTH 可以从 9 月到 8 月溢出吗?
  • @pavel 查看 Calendar.add() 的文档;它会在不同单位之间“进行”正确的日期计算。 (与 Ca​​lendar.roll() 方法不同,后者没有。)
  • 我建议你不要使用Date(也不要使用Calendar)。这些课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time APILocalDate

标签: java arrays list date kotlin


【解决方案1】:

java.time

这是一个简单的纯 Java 解决方案。与其他人一样,我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。

    Period step = Period.ofDays(-5);
    int numberOfDates = 10;
    
    Period totalPeriod = step.multipliedBy(numberOfDates);
    
    LocalDate today = LocalDate.now(ZoneId.of("America/Rosario"));
    List<LocalDate> dates = today.datesUntil(today.plus(totalPeriod), step)
            .collect(Collectors.toList());
    
    System.out.println(dates);

输出:

[2020-09-14, 2020-09-09, 2020-09-04, 2020-08-30, 2020-08-25, 2020-08-20、2020-08-15、2020-08-10、2020-08-05、2020-07-31]

我相信您可以翻译成 Kotlin,甚至可以在 Kotlin 中进一步完善它。

没有很好的记录表明您可以使用带有负数的两个参数 LocalDate.datesUntil(),但至少它适用于我的 Java 11。

很抱歉,您在问题中的解决方案不仅代码比需要的多,而且也不正确。每次减去 432 000 000 毫秒假定一天总是 24 小时。由于夏令时 (DST) 和其他时间异常,一天可能是 23 或 25 小时或介于两者之间的时间。通过使用LocalDate,我们不会遇到此类问题。您也可以使用 ZonedDateTimeLocalDateTime 来代替,如果您想包含一天中的时间,它们在夏季时间转换中也可以正常工作。

链接: Oracle tutorial: Date Time 解释如何使用 java.time。

【讨论】:

    【解决方案2】:

    我建议您从过时且容易出错的 java.util 日期时间 API 切换到 modern java.time 日期时间 API。从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。如果您的 Android API 级别仍然不符合 Java8,请检查 How to use ThreeTenABP in Android ProjectJava 8+ APIs available through desugaring

    使用 Java 现代日期时间 API 执行以下操作:

    import java.time.LocalDate;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            // Tests
            System.out.println(getPastDaysOnIntervalOf(10, 5));// 10 days in past at an interval of 5 days
            System.out.println(getPastDaysOnIntervalOf(5, 10));// 5 days in past at an interval of 10 days
        }
    
        static List<LocalDate> getPastDaysOnIntervalOf(int times, int interval) {
            // The list to be populated with the desired dates
            List<LocalDate> list = new ArrayList<>();
    
            // Today
            LocalDate date = LocalDate.now();
    
            for (int i = 1; i <= times; i++) {
                list.add(date);
                date = date.minusDays(interval);
            }
    
            // Return the populated list
            return list;
        }
    }
    

    输出:

    [2020-09-14, 2020-09-09, 2020-09-04, 2020-08-30, 2020-08-25, 2020-08-20, 2020-08-15, 2020-08-10, 2020-08-05, 2020-07-31]
    [2020-09-14, 2020-09-04, 2020-08-25, 2020-08-15, 2020-08-05]
    

    使用旧版 API:

    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            // Tests
            System.out.println(getPastDaysOnIntervalOf(10, 5));// 10 days in past at an interval of 5 days
            System.out.println(getPastDaysOnIntervalOf(5, 10));// 5 days in past at an interval of 10 days
        }
    
        static List<Date> getPastDaysOnIntervalOf(int times, int interval) {
            // The list to be populated with the desired dates
            List<Date> list = new ArrayList<>();
    
            // Today
            Calendar cal = Calendar.getInstance();
            Date date = cal.getTime();
    
            for (int i = 1; i <= times; i++) {
                list.add(date);
                cal.add(Calendar.DATE, -interval);
                date = cal.getTime();
            }
    
            // Return the populated list
            return list;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      相关资源
      最近更新 更多