【问题标题】:TemporalAdjuster - getting next date from adjusted dateTemporalAdjuster - 从调整日期获取下一个日期
【发布时间】:2020-03-13 15:05:15
【问题描述】:

假设我有一个自定义的TemporalAdjuster,每个星期天都会给我(也可能是每个第二个星期二等等)。如何计算一年中所有调整后的日期?

TemporalAdjuster myGamingAdjuster;
int myYear = 2003;
LocalDate myDate = LocalDate.now();
System.out.println(myDate.with(myGamingAdjuster)); // Gives only one date

【问题讨论】:

  • 能不能用简单的输入输出例子解释一下
  • 例如:我有一个自定义的 TemporalAdjuster。我不知道他到底在做什么。可能是这个调节器给了我一个星期天(一年大约 52 次)或圣诞节(一年一次)。现在,我想要一个循环来查找时间跨度内所有发生的日期。例如,一年内与此自定义调整员的所有约会。
  • 您确定TemporalAdjuster 是您的重复方案的正确表示吗?我还没有真正理解它应该如何做你想让它做的事情。
  • 并非所有的TemporalAdjuster 实现都会增加到未来的日期。一些,例如firstDayOfYear()firstDayOfMonth() 会重复返回相同的值。换句话说,一些TemporalAdjuster 对象是idempotent
  • 也不是所有的TemporalAdjusters 都限制自己的年份。例如TemporalAdjusters.previous(DayOfWeek.WEDNESDAY) 可以将日期调整为上一年。要将其调整到 2003 年的最后一个星期三(那年 12 月 31 日),您需要从 2004 年的日期开始。我认为您在问不可能。

标签: java date java-time localdate temporal


【解决方案1】:

您可以根据问题中的两个需求创建自定义方法,生成您所期望的,您可以创建这样的方法:

public List<LocalDate> generateDates(int year, int periodicDays, DayOfWeek startDay){
    LocalDate firstDay = LocalDate.of(year, Month.JANUARY, 1)
            .with(TemporalAdjusters.next(startDay));
    List<LocalDate> result = new ArrayList<>();
    do {
        result.add(firstDay);
        firstDay = firstDay.plusDays(periodicDays);
    } while (firstDay.getYear() == year);
    return result;
}

然后,像这样调用你的方法:

List<LocalDate> allSunDaysInYear = generateDates(2003, 7, DayOfWeek.SUNDAY)
List<LocalDate> allEvrySeconTuesdaysInYear = generateDates(2003, 14, DayOfWeek.MONDAY);

输出

[2003-01-05, 2003-01-12, 2003-01-19, 2003-01-26, 2003-02-02, 2003-02-09, ..]
[2003-01-06, 2003-01-20, 2003-02-03, 2003-02-17, 2003-03-03, 2003-03-17, ..]

【讨论】:

  • 谢谢,这对我有很大帮助!
  • @Zeraki 这取决于你的行动,为此,我想为每个案例创建一个方法,因为每个案例都可能与其他案例不同,没有一个解决方案可以解决所有问题。
【解决方案2】:

我假设“GamingAdjuster”会根据您上次使用 PlayStation 的日期告诉您下一个可以开启 PlayStation 的日期?我们假设最后一个日期是现在……

不幸的是,你不知道那个调整器是否会增加一个小时,或者它是否会将开始日期总是调整到可以到达的平安夜,对吧?

不过,您想知道今年剩余时间您可以进行多少场比赛,对吗?

试试这样的:

var currentYear = Year.now();
var startDate = LocalDateTime.now();
var counter = 0;

for( var date = startDate.with( myGamingAdjuster ); date.getYear() == currentYear.getValue(); date = date.with( myGamingAdjuster ) )
{
    ++counter;
}

out.println( counter );

我使用LocalDateTime,因为在我的假设中,调节器也可以增加一小时——这不适用于LocalDate。如果您对调节器的工作原理真的没有线索,这将是更安全的选择。

我们必须像我一样初始化date,以避免now也被计算在内,因为我们只想计算仍然可能的游戏会话,而当前的游戏会话已经结束……

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 2018-06-12
    • 2012-12-11
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多