gpt4 book ai didi

java - 忽略日期范围的年份的最佳做法

转载 作者:搜寻专家 更新时间:2023-11-01 01:48:40 25 4
gpt4 key购买 nike

我需要对有关季节的一些信息进行建模,并且需要以与年份无关的方式根据开始/结束日期来跟踪它们。 IE。我需要允许用户将夏季定义为介于 5 月 15 日和 9 月 10 日之间,并且所有年份都这样做。

我需要对 isThisDateInSeason 类型进行大量检查。所有日期操作函数(即日期、日历)似乎只适用于有效日期,即包括年份信息。

关于如何执行此操作是否有任何最佳实践?我可以想到一堆 hacky 方法来做这件事(即存储月份和月份的日期或存储日期并将它们带到基准年以便我可以比较),但似乎可能有更好的方法.

我正在用 Java 或 Groovy 编写此代码。

Joda-Time图书馆帮忙吗?我没有这方面的经验,但它看起来具有更大的灵 active 。

我找到了 this question关于如何从日期确定季节,但重点是月份,我需要更大的灵 active 来包括日期。

最佳答案

如果每个用户都拥有自己的数据(即,他们指定自己的季节,然后输入自己的信息),那么您可以将数据与季节作为其中的一部分进行存储,但是我觉得您所追求的场景是用于在以不同方式定义季节的众多用户之间共享数据。

您必须非常小心地“规范化”日期,因为闰年​​可能会导致意外问题,即尝试将 2 月 29 日设置为非闰年会导致问题/异常。

我已将以下内容放在一起,不幸的是它的 C# 但概念是相同的。我还没有实际测试代码,但作为伪代码,它可能会有所帮助。

public class SeasonChecker
{
public enum Season {Summer, Autumn, Winter, Spring};
private List<SeasonRange> _seasons = new List<SeasonRange>();

public void DefineSeason(Season season, DateTime starting, DateTime ending)
{
starting = starting.Date;
ending = ending.Date;

if(ending.Month < starting.Month)
{
// split into 2
DateTime tmp_ending = new DateTime(ending.Year, 12, 31);
DateTime tmp_starting = new DateTime(starting.Year, 1, 1);

SeasonRange r1 = new SeasonRange() { Season = season, Starting= tmp_starting, Ending = ending };
SeasonRange r2 = new SeasonRange() { Season = season, Starting= starting, Ending = tmp_ending };

this._seasons.Add(r1);
this._seasons.Add(r2);
}
else
{
SeasonRange r1 = new SeasonRange() { Season = season, Starting= starting, Ending = ending };
this._seasons.Add(r1);
}
}

public Season GetSeason(DateTime check)
{
foreach(SeasonRange range in _seasons)
{
if(range.InRange(check))
return range.Season;
}

throw new ArgumentOutOfRangeException("Does not fall into any season");
}


private class SeasonRange
{
public DateTime Starting;
public DateTime Ending;
public Season Season;

public bool InRange(DateTime test)
{
if(test.Month == Starting.Month)
{
if(test.Day >= Starting.Day)
{
return true;
}
}
else if(test.Month == Ending.Month)
{
if(test.Day <= Ending.Day)
{
return true;
}
}
else if(test.Month > Starting.Month && test.Month < Ending.Month)
{
return true;
}

return false;
}

}
}

注意上面的代码假设赛季不会在同一个月开始和结束——我认为这是一个相当安全的假设!

关于java - 忽略日期范围的年份的最佳做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/601036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com