Skip to content

Commit 628c344

Browse files
authored
Merge pull request mouredev#7165 from hozlucas28/Solution-44-Go
mouredev#44 - Go
2 parents 1e4f171 + 7f442af commit 628c344

File tree

1 file changed

+144
-0
lines changed

1 file changed

+144
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"os/exec"
7+
"sync"
8+
"time"
9+
)
10+
11+
/* -------------------------------------------------------------------------- */
12+
/* STRUCTS */
13+
/* -------------------------------------------------------------------------- */
14+
15+
type ITimer interface {
16+
GetEndDate() *time.Time
17+
TimerEnded() bool
18+
UpdateTimer(from time.Time, to time.Time)
19+
ToString() string
20+
}
21+
22+
type timer struct {
23+
Days int64
24+
Hours int64
25+
Minutes int64
26+
Seconds int64
27+
28+
endDate time.Time
29+
_ struct{}
30+
}
31+
32+
func NewTimer(from time.Time, to time.Time) ITimer {
33+
var timer timer = timer{endDate: to}
34+
35+
var unixStartDate int64 = from.Unix()
36+
var unixEndDate int64 = to.Unix()
37+
38+
var remainingTime int64 = unixEndDate - unixStartDate
39+
if remainingTime <= 0 {
40+
return &timer
41+
}
42+
43+
timer.Days = remainingTime / 86400
44+
remainingTime -= timer.Days * 86400
45+
46+
timer.Hours = remainingTime / 3600
47+
remainingTime -= timer.Hours * 3600
48+
49+
timer.Minutes = remainingTime / 60
50+
remainingTime -= timer.Minutes * 60
51+
52+
timer.Seconds = remainingTime
53+
54+
return &timer
55+
}
56+
57+
func (timer *timer) GetEndDate() *time.Time {
58+
return &timer.endDate
59+
}
60+
61+
func (timer *timer) TimerEnded() bool {
62+
return timer.Days == 0 && timer.Hours == 0 && timer.Minutes == 0 && timer.Seconds == 0
63+
}
64+
65+
func (timer *timer) UpdateTimer(from time.Time, to time.Time) {
66+
timer.endDate = to
67+
68+
var unixStartDate int64 = from.Unix()
69+
var unixEndDate int64 = to.Unix()
70+
71+
var remainingTime int64 = unixEndDate - unixStartDate
72+
if remainingTime <= 0 {
73+
timer.Days = 0
74+
timer.Hours = 0
75+
timer.Minutes = 0
76+
timer.Seconds = 0
77+
return
78+
}
79+
80+
timer.Days = remainingTime / 86400
81+
remainingTime -= timer.Days * 86400
82+
83+
timer.Hours = remainingTime / 3600
84+
remainingTime -= timer.Hours * 3600
85+
86+
timer.Minutes = remainingTime / 60
87+
remainingTime -= timer.Minutes * 60
88+
89+
timer.Seconds = remainingTime
90+
}
91+
92+
func (timer *timer) ToString() string {
93+
return fmt.Sprintf(
94+
"[ %06d days | %02d hours | %02d minutes | %02d seconds ]",
95+
timer.Days,
96+
timer.Hours,
97+
timer.Minutes,
98+
timer.Seconds,
99+
)
100+
}
101+
102+
/* -------------------------------------------------------------------------- */
103+
/* MAIN */
104+
/* -------------------------------------------------------------------------- */
105+
106+
func main() {
107+
var wg sync.WaitGroup
108+
109+
wg.Add(1)
110+
111+
go func() {
112+
var startDate time.Time = time.Now()
113+
var endDate time.Time = time.Date(2024, time.December, 25, 0, 0, 0, 0, time.Local)
114+
var timer ITimer = NewTimer(startDate, endDate)
115+
116+
var command = exec.Command("clear")
117+
command.Stdout = os.Stdout
118+
command.Run()
119+
120+
fmt.Printf(
121+
"> Time remaining for %s: %s.\n", endDate, timer.ToString(),
122+
)
123+
124+
for !timer.TimerEnded() {
125+
time.Sleep(time.Second)
126+
127+
startDate = time.Now()
128+
timer.UpdateTimer(startDate, *timer.GetEndDate())
129+
130+
command = exec.Command("clear")
131+
command.Stdout = os.Stdout
132+
command.Run()
133+
134+
fmt.Printf(
135+
"> Time remaining for %s: %s.\n", endDate.Local().UTC(), timer.ToString(),
136+
)
137+
}
138+
139+
fmt.Println("\n> The day has come!")
140+
wg.Done()
141+
}()
142+
143+
wg.Wait()
144+
}

0 commit comments

Comments
 (0)