public static void Main()
DailyManager dm = new DailyManager( new DateTime( 2022, 05, 10, 05, 10, 15) );
Console.Out.WriteLine( "can claim: " + dm.canClaim());
Console.Out.WriteLine( "until next: " + dm.untilNext());
Console.Out.WriteLine( "claim?: " + dm.claim());
Console.Out.WriteLine( "can claim: " + dm.canClaim());
Console.Out.WriteLine( "until next: " + dm.untilNext());
DateTime dt = DateTime.Now;
for (int i=0; i< 24; i++) {
Console.Out.WriteLine(": " + dt.AddHours(i));
public class DailyManager {
private DateTime nextClaim;
public DailyManager(DateTime? asOfDate = null) {
DateTime asOf = asOfDate ?? DateTime.Now;
nextClaim = asOf.Date.AddHours(12);
public bool canClaim(DateTime? asOfDate = null) {
DateTime asOf = asOfDate ?? DateTime.Now;
public TimeSpan untilNext(DateTime? asOfDate = null) {
DateTime asOf = asOfDate ?? DateTime.Now;
if ( canClaim(asOf) ) { return new TimeSpan(0); }
TimeSpan diff = nextClaim - asOf;
public bool claim(DateTime? asOfDate = null) {
DateTime asOf = asOfDate ?? DateTime.Now;
if ( !canClaim(asOf) ) { return false; }
TimeSpan diff = asOf - nextClaim;
Int64 daysPassed = diff.Days;
nextClaim = nextClaim.AddDays(daysPassed+1);