【问题标题】:To find the weekly date range based on the input根据输入查找每周日期范围
【发布时间】:2021-05-11 18:41:49
【问题描述】:

我的属性文件输入方案如下所示,用于每周报告

数据滞后 - 10 天

运行日 - 星期二。

要求基于日期滞后:我必须将日历向后移动 10 天。然后我想找到星期二(可以在参数中指定任何工作日)。

我想从中获得一份每周报告。

指定此配置时,例如今天 2021 年 5 月 11 日

5 月 11 日 - 10 天 = 2021 年 5 月 1 日。在此之后,根据运行日(例如星期一),我的日历应移至 4 月 26 日。

最终结果是

(星期一)4 月 26 日至 5 月 2 日(星期日)。

 val format_w = new SimpleDateFormat("yyyy-MM-dd")
    val cal_ins = Calendar.getInstance
    cal_ins.add(Calendar.DATE, -datalaginterval)
    val datlag_date = cal_ins.getTime()
    logger.info("datalag date"+datlag_date)

 cal_ins.add(Calendar.DATE, -7)
    val startdate = cal_ins.getTime
    val start_date   = format_w.format(startdate)

    println("start date-"+start_date)
    // calculate sunday last week (moves cal 6 days fwd)
    cal_ins.add(Calendar.DATE, 6)
    val enddate = cal_ins.getTime
    val end_date   = format_w.format(enddate)

    println("End date-"+end_date)

我正在使用 Java Calendar 类。

【问题讨论】:

  • Java 的 SimpleDateFormatCalendar 都过时了。它们的使用是必需的吗?
  • 它是一种用法。但我想存储开始和结束日期。 @jwvh
  • 不需要,我试过这种方法。@jwvh
  • 如果您不必使用这些类,我建议您查看 java.time 类(例如 LocalDate)及其方法。这些更容易使用,例如10 天前类似于LocalDate.now().minus(10, ChronoUnit.DAYS)

标签: java scala java-calendar


【解决方案1】:

您的问题相当混乱。也许这会帮助您朝着正确的方向开始。

import java.time.LocalDate
import java.time.DayOfWeek

val lagDate: LocalDate = LocalDate.now()          //today
                                  .minusDays(9L)  //less lag days

val nearestTues: LocalDate =  //Tuesday closest to lag date
  lagDate.minusDays(lagDate.getDayOfWeek().getValue() -
                    DayOfWeek.valueOf("TUESDAY").getValue())

val (tuesBefore
    ,tuesAfter) = if (nearestTues isAfter lagDate)
                    (nearestTues.minusDays(7L), nearestTues)
                  else
                    (nearestTues, nearestTues.plusDays(7L))

【讨论】:

    【解决方案2】:

    java.time

    与其他人一样,我强烈建议您使用现代 Java 日期和时间 API java.time 进行日期工作。我相信代码可能比其他答案更简单。原谅我的Java。我相信你会翻译成 Scala。

        int lagDays = 10;
        DayOfWeek runDay = DayOfWeek.TUESDAY;
        
        LocalDate today = LocalDate.now(ZoneId.of("Africa/Ceuta"));
        
        LocalDate start = today.minusDays(lagDays)
                               .with(TemporalAdjusters.previousOrSame(runDay));
        LocalDate end = start.plusDays(6);
        
        System.out.format("From %s through %s%n", start, end);
    

    刚才运行代码的时候,输出是:

    从 2021-04-27 到 2021-05-03

    如果要使用JVM的默认时区,请使用:

        LocalDate today = LocalDate.now(ZoneId.systemDefault());
    

    .with(TemporalAdjusters.previousOrSame(runDay)) 的工作原理:如果 10 天前已经是星期二,那就是你得到的日期。否则,您将获得上一个星期二,即 10 天前计算日期之前最近的星期二。在这个例子中,10 天前是 5 月 2 日星期日,所以我们得到了 4 月 27 日星期二。

    链接

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多