import static java.time .DayOfWeek .SATURDAY ;
import static java.time .DayOfWeek .SUNDAY ;
import java.time.DayOfWeek ;
import java.time.LocalDate ;
import java.time.LocalTime ;
import java.time.ZoneId ;
import java.time.ZonedDateTime ;
import java.time.format.TextStyle ;
import java.time.temporal.ChronoUnit ;
import java.time.temporal.TemporalAdjusters ;
import java.util.Locale ;
public class Main {
public static void main
( String [ ] args
) { // Tests
process( ZonedDateTime.now ( ZoneId.systemDefault ( ) ) ) ;
process( ZonedDateTime.of ( LocalDate.of ( 2021 , 6 , 23 ) , LocalTime.of ( 10 , 20 , 30 , 123456789 ) ,
ZoneId.systemDefault ( ) ) ) ;
process( ZonedDateTime.of ( LocalDate.of ( 2021 , 6 , 26 ) , LocalTime.of ( 10 , 20 , 30 , 123456789 ) ,
ZoneId.systemDefault ( ) ) ) ;
}
static long millisBetween( ZonedDateTime start, ZonedDateTime end) {
return ChronoUnit.MILLIS .between ( start, end) ;
}
static boolean isWeekend( ZonedDateTime now) {
DayOfWeek dow = now.getDayOfWeek ( ) ;
return dow == SATURDAY || dow == SUNDAY;
}
static void process( ZonedDateTime now) {
String dow
= now.
getDayOfWeek ( ) .
getDisplayName ( TextStyle.
FULL ,
Locale .
ENGLISH ) ; if ( isWeekend( now) ) {
System .
out .
printf ( "It's %s (a weekend) now. Monday is %d milliseconds ahead.%n" , dow,
millisBetween( now, now.with ( TemporalAdjusters.next ( DayOfWeek.MONDAY ) ) .toLocalDate ( )
.atStartOfDay ( ZoneId.systemDefault ( ) ) ) ) ;
} else {
System .
out .
printf ( "It's %s (a weekday) now. Saturday is %d milliseconds ahead.%n" , dow,
millisBetween( now, now.with ( TemporalAdjusters.next ( DayOfWeek.SATURDAY ) ) .toLocalDate ( )
.atStartOfDay ( ZoneId.systemDefault ( ) ) ) ) ;
}
}
}
aW1wb3J0IHN0YXRpYyBqYXZhLnRpbWUuRGF5T2ZXZWVrLlNBVFVSREFZOwppbXBvcnQgc3RhdGljIGphdmEudGltZS5EYXlPZldlZWsuU1VOREFZOwoKaW1wb3J0IGphdmEudGltZS5EYXlPZldlZWs7CmltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlOwppbXBvcnQgamF2YS50aW1lLkxvY2FsVGltZTsKaW1wb3J0IGphdmEudGltZS5ab25lSWQ7CmltcG9ydCBqYXZhLnRpbWUuWm9uZWREYXRlVGltZTsKaW1wb3J0IGphdmEudGltZS5mb3JtYXQuVGV4dFN0eWxlOwppbXBvcnQgamF2YS50aW1lLnRlbXBvcmFsLkNocm9ub1VuaXQ7CmltcG9ydCBqYXZhLnRpbWUudGVtcG9yYWwuVGVtcG9yYWxBZGp1c3RlcnM7CmltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwoKcHVibGljIGNsYXNzIE1haW4gewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoJCS8vIFRlc3RzCgkJcHJvY2Vzcyhab25lZERhdGVUaW1lLm5vdyhab25lSWQuc3lzdGVtRGVmYXVsdCgpKSk7CgkJcHJvY2Vzcyhab25lZERhdGVUaW1lLm9mKExvY2FsRGF0ZS5vZigyMDIxLCA2LCAyMyksIExvY2FsVGltZS5vZigxMCwgMjAsIDMwLCAxMjM0NTY3ODkpLAoJCQkJWm9uZUlkLnN5c3RlbURlZmF1bHQoKSkpOwoJCXByb2Nlc3MoWm9uZWREYXRlVGltZS5vZihMb2NhbERhdGUub2YoMjAyMSwgNiwgMjYpLCBMb2NhbFRpbWUub2YoMTAsIDIwLCAzMCwgMTIzNDU2Nzg5KSwKCQkJCVpvbmVJZC5zeXN0ZW1EZWZhdWx0KCkpKTsKCX0KCglzdGF0aWMgbG9uZyBtaWxsaXNCZXR3ZWVuKFpvbmVkRGF0ZVRpbWUgc3RhcnQsIFpvbmVkRGF0ZVRpbWUgZW5kKSB7CgkJcmV0dXJuIENocm9ub1VuaXQuTUlMTElTLmJldHdlZW4oc3RhcnQsIGVuZCk7Cgl9CgoJc3RhdGljIGJvb2xlYW4gaXNXZWVrZW5kKFpvbmVkRGF0ZVRpbWUgbm93KSB7CgkJRGF5T2ZXZWVrIGRvdyA9IG5vdy5nZXREYXlPZldlZWsoKTsKCQlyZXR1cm4gZG93ID09IFNBVFVSREFZIHx8IGRvdyA9PSBTVU5EQVk7Cgl9CgoJc3RhdGljIHZvaWQgcHJvY2Vzcyhab25lZERhdGVUaW1lIG5vdykgewoJCVN0cmluZyBkb3cgPSBub3cuZ2V0RGF5T2ZXZWVrKCkuZ2V0RGlzcGxheU5hbWUoVGV4dFN0eWxlLkZVTEwsIExvY2FsZS5FTkdMSVNIKTsKCQlpZiAoaXNXZWVrZW5kKG5vdykpIHsKCQkJU3lzdGVtLm91dC5wcmludGYoIkl0J3MgJXMgKGEgd2Vla2VuZCkgbm93LiBNb25kYXkgaXMgJWQgbWlsbGlzZWNvbmRzIGFoZWFkLiVuIiwgZG93LAoJCQkJCW1pbGxpc0JldHdlZW4obm93LCBub3cud2l0aChUZW1wb3JhbEFkanVzdGVycy5uZXh0KERheU9mV2Vlay5NT05EQVkpKS50b0xvY2FsRGF0ZSgpCgkJCQkJCQkuYXRTdGFydE9mRGF5KFpvbmVJZC5zeXN0ZW1EZWZhdWx0KCkpKSk7CgkJfSBlbHNlIHsKCQkJU3lzdGVtLm91dC5wcmludGYoIkl0J3MgJXMgKGEgd2Vla2RheSkgbm93LiBTYXR1cmRheSBpcyAlZCBtaWxsaXNlY29uZHMgYWhlYWQuJW4iLCBkb3csCgkJCQkJbWlsbGlzQmV0d2Vlbihub3csIG5vdy53aXRoKFRlbXBvcmFsQWRqdXN0ZXJzLm5leHQoRGF5T2ZXZWVrLlNBVFVSREFZKSkudG9Mb2NhbERhdGUoKQoJCQkJCQkJLmF0U3RhcnRPZkRheShab25lSWQuc3lzdGVtRGVmYXVsdCgpKSkpOwoJCX0KCX0KfQ==