java - 检查给定的日期是否在计划中。

时间:2016-10-09 09:01:02

标签: java calendar

我得到的公交时刻表如1101011(从星期日到星期六,每周7天) 1表示 - 是的,公共汽车在该日运行 0表示 - 当天没有公共汽车没有运行
假设在某个特定日期09 - 10月,任何人都可以告诉如何查找公交车是否运行?

(我仍在努力寻找更好的方法。

3 个答案:

答案 0 :(得分:1)

您可以将计划存储在数组中,然后根据星期几索引从中检索值。

private static final int[] SCHEDULE = new int[] {1, 0, 1, 0, 1, 1, 1};

public static void main(String[] args) {
    LocalDate testDate = LocalDate.of(2016, Month.OCTOBER, 8);
    System.out.println("testDate = " + testDate);

    DayOfWeek dayOfWeek = testDate.getDayOfWeek();
    System.out.println("Day of week = " + dayOfWeek);

    System.out.println("The bus " + (1 == SCHEDULE[dayOfWeek.getValue()-1] ? "goes" : "does not go") + " on " + testDate);
}

请注意,由于DayOfWeek枚举的索引显示为

,因此我已将星期日的值在时间表中移至最后。
  

int值遵循ISO-8601标准,从1(星期一)到7(星期日)。

答案 1 :(得分:1)

TL;博士

将输入字符串解析为EnumSet DayOfWeek常量,以表示总线运行的星期几。询问该集合是否包含任何特定日期的星期几。

Set<DayOfWeek> busRunDays = EnumSet. …
…
Boolean busRunsOn20161009 = 
    busRunDays.contains( 
        DayOfWeek.from( LocalDate.of( 2016 , Month.OCTOBER , 9 ) ) 
    ) 
;

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

DayOfWeek

Java包含DayOfWeek枚举,将七个实例定义为常量,一个用于每周的每一天。

DayOfWeek dow = DayOfWeek.from( ld );

您可以测试是否相等。

if( dow.equals( DayOfWeek.TUESDAY ) ) …

根据ISO 8601标准,它们按星期一到星期日编号并按1-7排序。

EnumSet

EnumSet类是Set非常有效的实现,用于保存枚举定义的对象。在内部表示为位向量,EnumSet占用的内存很少,执行速度非常快。

循环输入字符串字符,如果1将该星期几添加到集合中。

Set<DayOfWeek> busRunDays = EnumSet.noneOf( DayOfWeek.class );
…
busRunDays.add( DayOfWeek.SUNDAY );

在您的代码的其他地方,您会询问一周中的某一天是否在该集合中。

if( busRunDays.contains( DayOfWeek.WEDNESDAY ) ) …

示例代码,全部放在一起并准备好运行(风险自负,无保证)。

Set<DayOfWeek> busRunDays = EnumSet.noneOf ( DayOfWeek.class );

String input = "1101011";

DayOfWeek[] inputWeek = { DayOfWeek.SUNDAY , DayOfWeek.MONDAY , DayOfWeek.TUESDAY , DayOfWeek.WEDNESDAY , DayOfWeek.THURSDAY , DayOfWeek.FRIDAY , DayOfWeek.SATURDAY };  // Define the ordering of days in a non-standard week. 
int i = 0;
for ( char c : input.toCharArray () ) {
    if ( c == '1' ) {
        DayOfWeek dow = inputWeek[ i ];
        busRunDays.add ( dow );
    }
    i = ( i + 1 );  // Prepare for next loop.
}

转储到控制台。

System.out.println ( "input: " + input + " | busRunDays: " + busRunDays );
  输入:1101011 | busRunDays:[星期一,星期三,星期五,星期六,星期日]

如果您需要以1101011格式写出字符串,则可以使用相同类型的逻辑。

测试公共汽车今天是否运行。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Boolean busRunsToday = busRunDays.contains( DayOfWeek.from( today ) ) ;

测试公交车是否在特定日期运行。这专门回答了问题。

LocalDate ld = LocalDate.of( 2016 , Month.OCTOBER , 9 ) ;
Boolean busRunsOnDate = busRunDays.contains( DayOfWeek.from( ld ) ) ;

我强烈建议您养成传递这些DayOfWeekSet个对象的习惯,而不是使用像1-7这样的数字和像1101011这样的字符串。这样做可以提供type-safety,确保有效值,消除歧义,并使您的代码更加自我记录。

提示:如果您和您的用户像世界上许多人一样坚持标准的周一至周日周,那么生活会更容易。但我知道改变可能具有挑战性,特别是对美国人而言。因此,请务必在代码中仔细记录1101011输入值使用非标准的Sun-Mon周。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和&amp; java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

使用队列怎么样?

提供每个数据(字符0或1)以及每天轮询数据并检查是否运行。

此外,您必须确定空队列的结果。

所以你可以像日常系统一样编码。