classes/PSCronDateTime.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
enum PSCronTicks {
    Millisecond
    Second
    Minute
    Hour
    Day
}

class PSCronDateTime : System.IComparable {

    [datetime]$Local
    [datetime]$Utc

    PSCronDateTime ( [datetime]$Date ) {

        $this.__Init( $Date, [PSCronTicks]::Minute )

    }

    PSCronDateTime ( [datetime]$Date, [PSCronTicks]$Ticks ) {

        $this.__Init( $Date, $Ticks )

    }

    hidden __Init ( [datetime]$Date, [PSCronTicks]$Ticks ) {

        $Date = [datetime]::new( $Date.Ticks - ( $Date.Ticks % [timespan]::"TicksPer$Ticks" ), $Date.Kind )

        if ( $Date.Kind -eq 'Utc' ) {

            $this.Utc       = $Date
            $this.Local     = $Date.ToLocalTime()

        } else {

            $this.Utc       = $Date.ToUniversalTime()
            $this.Local     = $Date

        }

    }

    # default conversion to string uses local time
    [string] ToString () {

        return $this.Local.ToString() + ' (local)'

    }
    
    [string] ToString ( [string]$Format ) {

        return $this.Local.ToString( $Format ) + ' (local)'

    }

    [string] ToString ( [System.DateTimeKind]$Kind ) {

        return $this."$Kind".ToString() + ' (' + $Kind.ToString().ToLower() + ')'
        
    }

    [string] ToString ( [System.DateTimeKind]$Kind, [string]$Format ) {

        return $this."$Kind".ToString( $Format ) + ' (' + $Kind.ToString().ToLower() + ')'
        
    }

    [bool] Equals ( $that ) {

        [PSCronDateTime]$that = $that

        return ( $this.Utc -eq $that.Utc )
    
    }

    [int] CompareTo ( $that ) {

        [PSCronDateTime]$that = $that

        if ( $this.Utc -lt $that.Utc ) { return -1 }
        if ( $this.Utc -eq $that.Utc ) { return 0  }
        return 1
    
    }

    # always cast to local time
    static [datetime] op_Implicit( [PSCronDateTime]$Instance ) {
        
        return $Instance.Local
    
    }

    static [PSCronDateTime] op_Addition ( [PSCronDateTime]$Instance, [timespan]$Timespan ) {

        return [PSCronDateTime]( $Instance.Utc + $Timespan )
    
    }

    static [timespan] op_Subtraction ( [PSCronDateTime]$First, [PSCronDateTime]$Second ) {

        return [timespan]( $First.Utc - $Second.Utc )
    
    }

    static [PSCronDateTime] op_Subtraction ( [PSCronDateTime]$Instance, [timespan]$Timespan ) {

        return [PSCronDateTime]( $Instance.Utc - $Timespan )
    
    }

}