import java.time.DayOfWeek ;
import java.time.LocalDate ;
import java.time.format.DateTimeFormatter ;
import java.time.format.DateTimeParseException ;
import java.time.temporal.TemporalAdjusters ;
import java.util.Locale ;
public class Main {
public static void main
( String [ ] args
) { // Tests
System .
out .
println ( "Count: " + countSundaysBetween
( "1900 1 1" ,
"1902 1 1" ) ) ; System .
out .
println ( "Count: " + countSundaysBetween
( "1000000000000 2 2" ,
"1000000001000 3 2" ) ) ; }
static int countSundaysBetween
( String strStartDate,
String strEndDate
) { DateTimeFormatter dtfInput
= DateTimeFormatter.
ofPattern ( "uuuu M d" ,
Locale .
ENGLISH ) ; DateTimeFormatter dtfOutput
= DateTimeFormatter.
ofPattern ( "d MMMM uuuu" ,
Locale .
ENGLISH ) ; int count = 0 ;
LocalDate start, end;
System .
out .
printf ( "Processing start date: %s and end date: %s%n" , strStartDate, strEndDate
) ;
try {
start = LocalDate.parse ( strStartDate, dtfInput) ;
} catch ( DateTimeParseException e) {
System .
out .
printf ( "The start date %s can not be processed%n" , strStartDate
) ; return 0 ;
}
try {
end = LocalDate.parse ( strEndDate, dtfInput) ;
} catch ( DateTimeParseException e) {
System .
out .
printf ( "The end date %s can not be processed%n" , strEndDate
) ; return 0 ;
}
for ( LocalDate date = start.with ( TemporalAdjusters.firstDayOfMonth ( ) ) ; ! date.isAfter ( end) ; date = date
.plusMonths ( 1 ) ) {
if ( date.getDayOfWeek ( ) == DayOfWeek.SUNDAY ) {
System .
out .
println ( date.
format ( dtfOutput
) ) ; count++;
}
}
return count;
}
}
aW1wb3J0IGphdmEudGltZS5EYXlPZldlZWs7CmltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlOwppbXBvcnQgamF2YS50aW1lLmZvcm1hdC5EYXRlVGltZUZvcm1hdHRlcjsKaW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVQYXJzZUV4Y2VwdGlvbjsKaW1wb3J0IGphdmEudGltZS50ZW1wb3JhbC5UZW1wb3JhbEFkanVzdGVyczsKaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CgpwdWJsaWMgY2xhc3MgTWFpbiB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgLy8gVGVzdHMKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvdW50OiAiICsgY291bnRTdW5kYXlzQmV0d2VlbigiMTkwMCAxIDEiLCAiMTkwMiAxIDEiKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3VudDogIiArIGNvdW50U3VuZGF5c0JldHdlZW4oIjEwMDAwMDAwMDAwMDAgMiAyIiwgIjEwMDAwMDAwMDEwMDAgMyAyIikpOwogICAgfQoKICAgIHN0YXRpYyBpbnQgY291bnRTdW5kYXlzQmV0d2VlbihTdHJpbmcgc3RyU3RhcnREYXRlLCBTdHJpbmcgc3RyRW5kRGF0ZSkgewogICAgICAgIERhdGVUaW1lRm9ybWF0dGVyIGR0ZklucHV0ID0gRGF0ZVRpbWVGb3JtYXR0ZXIub2ZQYXR0ZXJuKCJ1dXV1IE0gZCIsIExvY2FsZS5FTkdMSVNIKTsKICAgICAgICBEYXRlVGltZUZvcm1hdHRlciBkdGZPdXRwdXQgPSBEYXRlVGltZUZvcm1hdHRlci5vZlBhdHRlcm4oImQgTU1NTSB1dXV1IiwgTG9jYWxlLkVOR0xJU0gpOwogICAgICAgIGludCBjb3VudCA9IDA7CgogICAgICAgIExvY2FsRGF0ZSBzdGFydCwgZW5kOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiUHJvY2Vzc2luZyBzdGFydCBkYXRlOiAlcyBhbmQgZW5kIGRhdGU6ICVzJW4iLCBzdHJTdGFydERhdGUsIHN0ckVuZERhdGUpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBzdGFydCA9IExvY2FsRGF0ZS5wYXJzZShzdHJTdGFydERhdGUsIGR0ZklucHV0KTsKICAgICAgICB9IGNhdGNoIChEYXRlVGltZVBhcnNlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlRoZSBzdGFydCBkYXRlICVzIGNhbiBub3QgYmUgcHJvY2Vzc2VkJW4iLCBzdHJTdGFydERhdGUpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGVuZCA9IExvY2FsRGF0ZS5wYXJzZShzdHJFbmREYXRlLCBkdGZJbnB1dCk7CiAgICAgICAgfSBjYXRjaCAoRGF0ZVRpbWVQYXJzZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJUaGUgZW5kIGRhdGUgJXMgY2FuIG5vdCBiZSBwcm9jZXNzZWQlbiIsIHN0ckVuZERhdGUpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIGZvciAoTG9jYWxEYXRlIGRhdGUgPSBzdGFydC53aXRoKFRlbXBvcmFsQWRqdXN0ZXJzLmZpcnN0RGF5T2ZNb250aCgpKTsgIWRhdGUuaXNBZnRlcihlbmQpOyBkYXRlID0gZGF0ZQogICAgICAgICAgICAgICAgLnBsdXNNb250aHMoMSkpIHsKICAgICAgICAgICAgaWYgKGRhdGUuZ2V0RGF5T2ZXZWVrKCkgPT0gRGF5T2ZXZWVrLlNVTkRBWSkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRhdGUuZm9ybWF0KGR0Zk91dHB1dCkpOwogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNvdW50OwogICAgfQp9