tme

Toggl like Time Manager
git clone git://gtms.dev:tme
Log | Files | Refs

time.go (2777B)


      1 package main
      2 
      3 import (
      4 	"fmt"
      5 	"strings"
      6 	"time"
      7 )
      8 
      9 const (
     10 	FileNameLayout = "0601021504"
     11 	DataTimeLayout = time.RFC3339
     12 )
     13 
     14 type Time struct {
     15 	context time.Time
     16 }
     17 
     18 func NewTime(t time.Time) *Time {
     19 	return &Time{t}
     20 }
     21 
     22 func NewTimeToday() *Time {
     23 	return &Time{time.Now()}
     24 }
     25 
     26 func (et *Time) ParseArg(raw string) (time.Time, error) {
     27 	return et.ParseArgDir(raw, false)
     28 }
     29 
     30 func (et *Time) ParseArgRight(raw string) (time.Time, error) {
     31 	return et.ParseArgDir(raw, true)
     32 }
     33 
     34 // TODO(tms) 11.02.23: Simplify
     35 func (et *Time) ParseArgDir(raw string, shiftRight bool) (time.Time, error) {
     36 	parts := strings.Split(raw, " ")
     37 	hour := et.context.Hour()
     38 	min := et.context.Minute()
     39 	sec := et.context.Second()
     40 	year, mon, day := et.context.Date()
     41 
     42 	zeroTime := 0
     43 	if shiftRight {
     44 		zeroTime = 59
     45 	}
     46 
     47 	var parsed bool
     48 	part := parts[0]
     49 
     50 	t, err := time.Parse("15", part)
     51 	if err == nil {
     52 		parsed = true
     53 		hour = t.Hour()
     54 		min = zeroTime
     55 		sec = zeroTime
     56 	}
     57 
     58 	t, err = time.Parse("15:4", part)
     59 	if err == nil {
     60 		parsed = true
     61 		hour = t.Hour()
     62 		min = t.Minute()
     63 		sec = zeroTime
     64 	}
     65 
     66 	t, err = time.Parse("15:4:5", part)
     67 	if err == nil {
     68 		parsed = true
     69 		hour = t.Hour()
     70 		min = t.Minute()
     71 		sec = t.Second()
     72 	}
     73 
     74 	t, err = time.Parse("2/1", part)
     75 	if err == nil {
     76 		parsed = true
     77 		hour = zeroTime
     78 		min = zeroTime
     79 		sec = zeroTime
     80 		day = t.Day()
     81 		mon = t.Month()
     82 		year = et.context.Year()
     83 	}
     84 
     85 	t, err = time.Parse("1/2006", part)
     86 	if err == nil {
     87 		parsed = true
     88 		hour = zeroTime
     89 		min = zeroTime
     90 		sec = zeroTime
     91 
     92 		zeroDay := 1
     93 		firstOfMonth := time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, et.context.Location())
     94 		lastOfMonth := firstOfMonth.AddDate(0, 1, -1)
     95 		if shiftRight {
     96 			zeroDay = lastOfMonth.Day()
     97 		}
     98 
     99 		day = zeroDay
    100 
    101 		mon = t.Month()
    102 		year = t.Year()
    103 	}
    104 
    105 	t, err = time.Parse("2/1/2006", part)
    106 	if err == nil {
    107 		parsed = true
    108 		hour = zeroTime
    109 		min = zeroTime
    110 		sec = zeroTime
    111 		day = t.Day()
    112 		mon = t.Month()
    113 		year = t.Year()
    114 	}
    115 
    116 	if !parsed && len(raw) > 0 {
    117 		return time.Now(), fmt.Errorf("Cannot parse %q", raw)
    118 	}
    119 
    120 	if len(parts) > 1 {
    121 		part = parts[1]
    122 		t, err := time.Parse("2", part)
    123 		if err == nil {
    124 			day = t.Day()
    125 			mon = et.context.Month()
    126 			year = et.context.Year()
    127 		}
    128 
    129 		t, err = time.Parse("2/1", part)
    130 		if err == nil {
    131 			day = t.Day()
    132 			mon = t.Month()
    133 			year = et.context.Year()
    134 		}
    135 
    136 		t, err = time.Parse("2/1/2006", part)
    137 		if err == nil {
    138 			day = t.Day()
    139 			mon = t.Month()
    140 			year = t.Year()
    141 		}
    142 	}
    143 
    144 	return time.Date(year, mon, day, hour, min, sec, 0, et.context.Location()), nil
    145 }
    146 
    147 func (et *Time) ParseEntry(raw string) (time.Time, error) {
    148 	t, err := time.Parse(DataTimeLayout, raw)
    149 	return time.Date(
    150 		t.Year(),
    151 		t.Month(),
    152 		t.Day(),
    153 		t.Hour(),
    154 		t.Minute(),
    155 		t.Second(),
    156 		0,
    157 		et.context.Location(),
    158 	), err
    159 }