pax_global_header00006660000000000000000000000064135544515370014526gustar00rootroot0000000000000052 comment=7e7333ac029d4aad7e88500a30889fcd22489425 now-1.1.1/000077500000000000000000000000001355445153700123315ustar00rootroot00000000000000now-1.1.1/Guardfile000066400000000000000000000000511355445153700141520ustar00rootroot00000000000000guard 'gotest' do watch(%r{\.go$}) end now-1.1.1/License000066400000000000000000000021111355445153700136310ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013-NOW Jinzhu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. now-1.1.1/README.md000066400000000000000000000117301355445153700136120ustar00rootroot00000000000000## Now Now is a time toolkit for golang [![wercker status](https://app.wercker.com/status/a350da4eae6cb28a35687ba41afb565a/s/master "wercker status")](https://app.wercker.com/project/byKey/a350da4eae6cb28a35687ba41afb565a) ## Install ``` go get -u github.com/jinzhu/now ``` ## Usage Calculating time based on current time ```go import "github.com/jinzhu/now" time.Now() // 2013-11-18 17:51:49.123456789 Mon now.BeginningOfMinute() // 2013-11-18 17:51:00 Mon now.BeginningOfHour() // 2013-11-18 17:00:00 Mon now.BeginningOfDay() // 2013-11-18 00:00:00 Mon now.BeginningOfWeek() // 2013-11-17 00:00:00 Sun now.BeginningOfMonth() // 2013-11-01 00:00:00 Fri now.BeginningOfQuarter() // 2013-10-01 00:00:00 Tue now.BeginningOfYear() // 2013-01-01 00:00:00 Tue now.WeekStartDay = time.Monday // Set Monday as first day, default is Sunday now.BeginningOfWeek() // 2013-11-18 00:00:00 Mon now.EndOfMinute() // 2013-11-18 17:51:59.999999999 Mon now.EndOfHour() // 2013-11-18 17:59:59.999999999 Mon now.EndOfDay() // 2013-11-18 23:59:59.999999999 Mon now.EndOfWeek() // 2013-11-23 23:59:59.999999999 Sat now.EndOfMonth() // 2013-11-30 23:59:59.999999999 Sat now.EndOfQuarter() // 2013-12-31 23:59:59.999999999 Tue now.EndOfYear() // 2013-12-31 23:59:59.999999999 Tue now.WeekStartDay = time.Monday // Set Monday as first day, default is Sunday now.EndOfWeek() // 2013-11-24 23:59:59.999999999 Sun ``` Calculating time based on another time ```go t := time.Date(2013, 02, 18, 17, 51, 49, 123456789, time.Now().Location()) now.With(t).EndOfMonth() // 2013-02-28 23:59:59.999999999 Thu ``` Calculating time based on configuration ```go location, err := time.LoadLocation("Asia/Shanghai") myConfig := &now.Config{ WeekStartDay: time.Monday, TimeLocation: location, TimeFormats: []string{"2006-01-02 15:04:05"}, } t := time.Date(2013, 11, 18, 17, 51, 49, 123456789, time.Now().Location()) // // 2013-11-18 17:51:49.123456789 Mon myConfig.With(t).BeginningOfWeek() // 2013-11-18 00:00:00 Mon myConfig.Parse("2002-10-12 22:14:01") // 2002-10-12 22:14:01 myConfig.Parse("2002-10-12 22:14") // returns error 'can't parse string as time: 2002-10-12 22:14' ``` ### Monday/Sunday Don't be bothered with the `WeekStartDay` setting, you can use `Monday`, `Sunday` ```go now.Monday() // 2013-11-18 00:00:00 Mon now.Sunday() // 2013-11-24 00:00:00 Sun (Next Sunday) now.EndOfSunday() // 2013-11-24 23:59:59.999999999 Sun (End of next Sunday) t := time.Date(2013, 11, 24, 17, 51, 49, 123456789, time.Now().Location()) // 2013-11-24 17:51:49.123456789 Sun now.With(t).Monday() // 2013-11-18 00:00:00 Sun (Last Monday if today is Sunday) now.With(t).Sunday() // 2013-11-24 00:00:00 Sun (Beginning Of Today if today is Sunday) now.With(t).EndOfSunday() // 2013-11-24 23:59:59.999999999 Sun (End of Today if today is Sunday) ``` ### Parse String to Time ```go time.Now() // 2013-11-18 17:51:49.123456789 Mon // Parse(string) (time.Time, error) t, err := now.Parse("2017") // 2017-01-01 00:00:00, nil t, err := now.Parse("2017-10") // 2017-10-01 00:00:00, nil t, err := now.Parse("2017-10-13") // 2017-10-13 00:00:00, nil t, err := now.Parse("1999-12-12 12") // 1999-12-12 12:00:00, nil t, err := now.Parse("1999-12-12 12:20") // 1999-12-12 12:20:00, nil t, err := now.Parse("1999-12-12 12:20:21") // 1999-12-12 12:20:00, nil t, err := now.Parse("10-13") // 2013-10-13 00:00:00, nil t, err := now.Parse("12:20") // 2013-11-18 12:20:00, nil t, err := now.Parse("12:20:13") // 2013-11-18 12:20:13, nil t, err := now.Parse("14") // 2013-11-18 14:00:00, nil t, err := now.Parse("99:99") // 2013-11-18 12:20:00, Can't parse string as time: 99:99 // MustParse must parse string to time or it will panic now.MustParse("2013-01-13") // 2013-01-13 00:00:00 now.MustParse("02-17") // 2013-02-17 00:00:00 now.MustParse("2-17") // 2013-02-17 00:00:00 now.MustParse("8") // 2013-11-18 08:00:00 now.MustParse("2002-10-12 22:14") // 2002-10-12 22:14:00 now.MustParse("99:99") // panic: Can't parse string as time: 99:99 ``` Extend `now` to support more formats is quite easy, just update `now.TimeFormats` with other time layouts, e.g: ```go now.TimeFormats = append(now.TimeFormats, "02 Jan 2006 15:04") ``` Please send me pull requests if you want a format to be supported officially ## Contributing You can help to make the project better, check out [http://gorm.io/contribute.html](http://gorm.io/contribute.html) for things you can do. # Author **jinzhu** * * * ## License Released under the [MIT License](http://www.opensource.org/licenses/MIT). now-1.1.1/go.mod000066400000000000000000000000461355445153700134370ustar00rootroot00000000000000module github.com/jinzhu/now go 1.12 now-1.1.1/main.go000066400000000000000000000115461355445153700136130ustar00rootroot00000000000000// Package now is a time toolkit for golang. // // More details README here: https://github.com/jinzhu/now // // import "github.com/jinzhu/now" // // now.BeginningOfMinute() // 2013-11-18 17:51:00 Mon // now.BeginningOfDay() // 2013-11-18 00:00:00 Mon // now.EndOfDay() // 2013-11-18 23:59:59.999999999 Mon package now import "time" // WeekStartDay set week start day, default is sunday var WeekStartDay = time.Sunday // TimeFormats default time formats will be parsed as var TimeFormats = []string{ "2006", "2006-1", "2006-1-2", "2006-1-2 15", "2006-1-2 15:4", "2006-1-2 15:4:5", "1-2", "15:4:5", "15:4", "15", "15:4:5 Jan 2, 2006 MST", "2006-01-02 15:04:05.999999999 -0700 MST", "2006-01-02T15:04:05-07:00", "2006.1.2", "2006.1.2 15:04:05", "2006.01.02", "2006.01.02 15:04:05", "1/2/2006", "1/2/2006 15:4:5", "2006/01/02", "2006/01/02 15:04:05", time.ANSIC, time.UnixDate, time.RubyDate, time.RFC822, time.RFC822Z, time.RFC850, time.RFC1123, time.RFC1123Z, time.RFC3339, time.RFC3339Nano, time.Kitchen, time.Stamp, time.StampMilli, time.StampMicro, time.StampNano, } // Config configuration for now package type Config struct { WeekStartDay time.Weekday TimeLocation *time.Location TimeFormats []string } // DefaultConfig default config var DefaultConfig *Config // New initialize Now based on configuration func (config *Config) With(t time.Time) *Now { return &Now{Time: t, Config: config} } // Parse parse string to time based on configuration func (config *Config) Parse(strs ...string) (time.Time, error) { if config.TimeLocation == nil { return config.With(time.Now()).Parse(strs...) } else { return config.With(time.Now().In(config.TimeLocation)).Parse(strs...) } } // MustParse must parse string to time or will panic func (config *Config) MustParse(strs ...string) time.Time { if config.TimeLocation == nil { return config.With(time.Now()).MustParse(strs...) } else { return config.With(time.Now().In(config.TimeLocation)).MustParse(strs...) } } // Now now struct type Now struct { time.Time *Config } // With initialize Now with time func With(t time.Time) *Now { config := DefaultConfig if config == nil { config = &Config{ WeekStartDay: WeekStartDay, TimeFormats: TimeFormats, } } return &Now{Time: t, Config: config} } // New initialize Now with time func New(t time.Time) *Now { return With(t) } // BeginningOfMinute beginning of minute func BeginningOfMinute() time.Time { return With(time.Now()).BeginningOfMinute() } // BeginningOfHour beginning of hour func BeginningOfHour() time.Time { return With(time.Now()).BeginningOfHour() } // BeginningOfDay beginning of day func BeginningOfDay() time.Time { return With(time.Now()).BeginningOfDay() } // BeginningOfWeek beginning of week func BeginningOfWeek() time.Time { return With(time.Now()).BeginningOfWeek() } // BeginningOfMonth beginning of month func BeginningOfMonth() time.Time { return With(time.Now()).BeginningOfMonth() } // BeginningOfQuarter beginning of quarter func BeginningOfQuarter() time.Time { return With(time.Now()).BeginningOfQuarter() } // BeginningOfYear beginning of year func BeginningOfYear() time.Time { return With(time.Now()).BeginningOfYear() } // EndOfMinute end of minute func EndOfMinute() time.Time { return With(time.Now()).EndOfMinute() } // EndOfHour end of hour func EndOfHour() time.Time { return With(time.Now()).EndOfHour() } // EndOfDay end of day func EndOfDay() time.Time { return With(time.Now()).EndOfDay() } // EndOfWeek end of week func EndOfWeek() time.Time { return With(time.Now()).EndOfWeek() } // EndOfMonth end of month func EndOfMonth() time.Time { return With(time.Now()).EndOfMonth() } // EndOfQuarter end of quarter func EndOfQuarter() time.Time { return With(time.Now()).EndOfQuarter() } // EndOfYear end of year func EndOfYear() time.Time { return With(time.Now()).EndOfYear() } // Monday monday func Monday() time.Time { return With(time.Now()).Monday() } // Sunday sunday func Sunday() time.Time { return With(time.Now()).Sunday() } // EndOfSunday end of sunday func EndOfSunday() time.Time { return With(time.Now()).EndOfSunday() } // Parse parse string to time func Parse(strs ...string) (time.Time, error) { return With(time.Now()).Parse(strs...) } // ParseInLocation parse string to time in location func ParseInLocation(loc *time.Location, strs ...string) (time.Time, error) { return With(time.Now().In(loc)).Parse(strs...) } // MustParse must parse string to time or will panic func MustParse(strs ...string) time.Time { return With(time.Now()).MustParse(strs...) } // MustParseInLocation must parse string to time in location or will panic func MustParseInLocation(loc *time.Location, strs ...string) time.Time { return With(time.Now().In(loc)).MustParse(strs...) } // Between check now between the begin, end time or not func Between(time1, time2 string) bool { return With(time.Now()).Between(time1, time2) } now-1.1.1/now.go000066400000000000000000000134561355445153700134740ustar00rootroot00000000000000package now import ( "errors" "regexp" "time" ) // BeginningOfMinute beginning of minute func (now *Now) BeginningOfMinute() time.Time { return now.Truncate(time.Minute) } // BeginningOfHour beginning of hour func (now *Now) BeginningOfHour() time.Time { y, m, d := now.Date() return time.Date(y, m, d, now.Time.Hour(), 0, 0, 0, now.Time.Location()) } // BeginningOfDay beginning of day func (now *Now) BeginningOfDay() time.Time { y, m, d := now.Date() return time.Date(y, m, d, 0, 0, 0, 0, now.Time.Location()) } // BeginningOfWeek beginning of week func (now *Now) BeginningOfWeek() time.Time { t := now.BeginningOfDay() weekday := int(t.Weekday()) if now.WeekStartDay != time.Sunday { weekStartDayInt := int(now.WeekStartDay) if weekday < weekStartDayInt { weekday = weekday + 7 - weekStartDayInt } else { weekday = weekday - weekStartDayInt } } return t.AddDate(0, 0, -weekday) } // BeginningOfMonth beginning of month func (now *Now) BeginningOfMonth() time.Time { y, m, _ := now.Date() return time.Date(y, m, 1, 0, 0, 0, 0, now.Location()) } // BeginningOfQuarter beginning of quarter func (now *Now) BeginningOfQuarter() time.Time { month := now.BeginningOfMonth() offset := (int(month.Month()) - 1) % 3 return month.AddDate(0, -offset, 0) } // BeginningOfHalf beginning of half year func (now *Now) BeginningOfHalf() time.Time { month := now.BeginningOfMonth() offset := (int(month.Month()) - 1) % 6 return month.AddDate(0, -offset, 0) } // BeginningOfYear BeginningOfYear beginning of year func (now *Now) BeginningOfYear() time.Time { y, _, _ := now.Date() return time.Date(y, time.January, 1, 0, 0, 0, 0, now.Location()) } // EndOfMinute end of minute func (now *Now) EndOfMinute() time.Time { return now.BeginningOfMinute().Add(time.Minute - time.Nanosecond) } // EndOfHour end of hour func (now *Now) EndOfHour() time.Time { return now.BeginningOfHour().Add(time.Hour - time.Nanosecond) } // EndOfDay end of day func (now *Now) EndOfDay() time.Time { y, m, d := now.Date() return time.Date(y, m, d, 23, 59, 59, int(time.Second-time.Nanosecond), now.Location()) } // EndOfWeek end of week func (now *Now) EndOfWeek() time.Time { return now.BeginningOfWeek().AddDate(0, 0, 7).Add(-time.Nanosecond) } // EndOfMonth end of month func (now *Now) EndOfMonth() time.Time { return now.BeginningOfMonth().AddDate(0, 1, 0).Add(-time.Nanosecond) } // EndOfQuarter end of quarter func (now *Now) EndOfQuarter() time.Time { return now.BeginningOfQuarter().AddDate(0, 3, 0).Add(-time.Nanosecond) } // EndOfHalf end of half year func (now *Now) EndOfHalf() time.Time { return now.BeginningOfHalf().AddDate(0, 6, 0).Add(-time.Nanosecond) } // EndOfYear end of year func (now *Now) EndOfYear() time.Time { return now.BeginningOfYear().AddDate(1, 0, 0).Add(-time.Nanosecond) } // Monday monday func (now *Now) Monday() time.Time { t := now.BeginningOfDay() weekday := int(t.Weekday()) if weekday == 0 { weekday = 7 } return t.AddDate(0, 0, -weekday+1) } // Sunday sunday func (now *Now) Sunday() time.Time { t := now.BeginningOfDay() weekday := int(t.Weekday()) if weekday == 0 { return t } return t.AddDate(0, 0, (7 - weekday)) } // EndOfSunday end of sunday func (now *Now) EndOfSunday() time.Time { return New(now.Sunday()).EndOfDay() } func (now *Now) parseWithFormat(str string, location *time.Location) (t time.Time, err error) { for _, format := range now.TimeFormats { t, err = time.ParseInLocation(format, str, location) if err == nil { return } } err = errors.New("Can't parse string as time: " + str) return } var hasTimeRegexp = regexp.MustCompile(`(\s+|^\s*)\d{1,2}((:\d{1,2})*|((:\d{1,2}){2}\.(\d{3}|\d{6}|\d{9})))\s*$`) // match 15:04:05, 15:04:05.000, 15:04:05.000000 15, 2017-01-01 15:04, etc var onlyTimeRegexp = regexp.MustCompile(`^\s*\d{1,2}((:\d{1,2})*|((:\d{1,2}){2}\.(\d{3}|\d{6}|\d{9})))\s*$`) // match 15:04:05, 15, 15:04:05.000, 15:04:05.000000, etc // Parse parse string to time func (now *Now) Parse(strs ...string) (t time.Time, err error) { var ( setCurrentTime bool parseTime []int currentTime = []int{now.Nanosecond(), now.Second(), now.Minute(), now.Hour(), now.Day(), int(now.Month()), now.Year()} currentLocation = now.Location() onlyTimeInStr = true ) for _, str := range strs { hasTimeInStr := hasTimeRegexp.MatchString(str) // match 15:04:05, 15 onlyTimeInStr = hasTimeInStr && onlyTimeInStr && onlyTimeRegexp.MatchString(str) if t, err = now.parseWithFormat(str, currentLocation); err == nil { location := t.Location() parseTime = []int{t.Nanosecond(), t.Second(), t.Minute(), t.Hour(), t.Day(), int(t.Month()), t.Year()} for i, v := range parseTime { // Don't reset hour, minute, second if current time str including time if hasTimeInStr && i <= 3 { continue } // If value is zero, replace it with current time if v == 0 { if setCurrentTime { parseTime[i] = currentTime[i] } } else { setCurrentTime = true } // if current time only includes time, should change day, month to current time if onlyTimeInStr { if i == 4 || i == 5 { parseTime[i] = currentTime[i] continue } } } t = time.Date(parseTime[6], time.Month(parseTime[5]), parseTime[4], parseTime[3], parseTime[2], parseTime[1], parseTime[0], location) currentTime = []int{t.Nanosecond(), t.Second(), t.Minute(), t.Hour(), t.Day(), int(t.Month()), t.Year()} } } return } // MustParse must parse string to time or it will panic func (now *Now) MustParse(strs ...string) (t time.Time) { t, err := now.Parse(strs...) if err != nil { panic(err) } return t } // Between check time between the begin, end time or not func (now *Now) Between(begin, end string) bool { beginTime := now.MustParse(begin) endTime := now.MustParse(end) return now.After(beginTime) && now.Before(endTime) } now-1.1.1/now_test.go000066400000000000000000000355611355445153700145340ustar00rootroot00000000000000package now import ( "testing" "time" ) var ( format = "2006-01-02 15:04:05.999999999" locationCaracas *time.Location locationBerlin *time.Location timeCaracas time.Time ) func init() { var err error if locationCaracas, err = time.LoadLocation("America/Caracas"); err != nil { panic(err) } if locationBerlin, err = time.LoadLocation("Europe/Berlin"); err != nil { panic(err) } timeCaracas = time.Date(2016, 1, 1, 12, 10, 0, 0, locationCaracas) } func assertT(t *testing.T) func(time.Time, string, string) { return func(actual time.Time, expected string, msg string) { actualStr := actual.Format(format) if actualStr != expected { t.Errorf("Failed %s: actual: %v, expected: %v", msg, actualStr, expected) } } } func TestBeginningOf(t *testing.T) { assert := assertT(t) n := time.Date(2013, 11, 18, 17, 51, 49, 123456789, time.UTC) assert(With(n).BeginningOfMinute(), "2013-11-18 17:51:00", "BeginningOfMinute") WeekStartDay = time.Monday assert(With(n).BeginningOfWeek(), "2013-11-18 00:00:00", "BeginningOfWeek, FirstDayMonday") WeekStartDay = time.Tuesday assert(With(n).BeginningOfWeek(), "2013-11-12 00:00:00", "BeginningOfWeek, FirstDayTuesday") WeekStartDay = time.Wednesday assert(With(n).BeginningOfWeek(), "2013-11-13 00:00:00", "BeginningOfWeek, FirstDayWednesday") WeekStartDay = time.Thursday assert(With(n).BeginningOfWeek(), "2013-11-14 00:00:00", "BeginningOfWeek, FirstDayThursday") WeekStartDay = time.Friday assert(With(n).BeginningOfWeek(), "2013-11-15 00:00:00", "BeginningOfWeek, FirstDayFriday") WeekStartDay = time.Saturday assert(With(n).BeginningOfWeek(), "2013-11-16 00:00:00", "BeginningOfWeek, FirstDaySaturday") WeekStartDay = time.Sunday assert(With(n).BeginningOfWeek(), "2013-11-17 00:00:00", "BeginningOfWeek, FirstDaySunday") assert(With(n).BeginningOfHour(), "2013-11-18 17:00:00", "BeginningOfHour") // Truncate with hour bug assert(With(timeCaracas).BeginningOfHour(), "2016-01-01 12:00:00", "BeginningOfHour Caracas") assert(With(n).BeginningOfDay(), "2013-11-18 00:00:00", "BeginningOfDay") location, err := time.LoadLocation("Japan") if err != nil { t.Fatalf("Error loading location: %v", err) } beginningOfDay := time.Date(2015, 05, 01, 0, 0, 0, 0, location) assert(With(beginningOfDay).BeginningOfDay(), "2015-05-01 00:00:00", "BeginningOfDay") // DST dstBeginningOfDay := time.Date(2017, 10, 29, 10, 0, 0, 0, locationBerlin) assert(With(dstBeginningOfDay).BeginningOfDay(), "2017-10-29 00:00:00", "BeginningOfDay DST") assert(With(n).BeginningOfWeek(), "2013-11-17 00:00:00", "BeginningOfWeek") dstBegginingOfWeek := time.Date(2017, 10, 30, 12, 0, 0, 0, locationBerlin) assert(With(dstBegginingOfWeek).BeginningOfWeek(), "2017-10-29 00:00:00", "BeginningOfWeek") dstBegginingOfWeek = time.Date(2017, 10, 29, 12, 0, 0, 0, locationBerlin) assert(With(dstBegginingOfWeek).BeginningOfWeek(), "2017-10-29 00:00:00", "BeginningOfWeek") WeekStartDay = time.Monday assert(With(n).BeginningOfWeek(), "2013-11-18 00:00:00", "BeginningOfWeek, FirstDayMonday") dstBegginingOfWeek = time.Date(2017, 10, 24, 12, 0, 0, 0, locationBerlin) assert(With(dstBegginingOfWeek).BeginningOfWeek(), "2017-10-23 00:00:00", "BeginningOfWeek, FirstDayMonday") dstBegginingOfWeek = time.Date(2017, 10, 29, 12, 0, 0, 0, locationBerlin) assert(With(dstBegginingOfWeek).BeginningOfWeek(), "2017-10-23 00:00:00", "BeginningOfWeek, FirstDayMonday") WeekStartDay = time.Sunday assert(With(n).BeginningOfMonth(), "2013-11-01 00:00:00", "BeginningOfMonth") // DST dstBeginningOfMonth := time.Date(2017, 10, 31, 0, 0, 0, 0, locationBerlin) assert(With(dstBeginningOfMonth).BeginningOfMonth(), "2017-10-01 00:00:00", "BeginningOfMonth DST") assert(With(n).BeginningOfQuarter(), "2013-10-01 00:00:00", "BeginningOfQuarter") // DST assert(With(dstBeginningOfMonth).BeginningOfQuarter(), "2017-10-01 00:00:00", "BeginningOfQuarter DST") dstBeginningOfQuarter := time.Date(2017, 11, 24, 0, 0, 0, 0, locationBerlin) assert(With(dstBeginningOfQuarter).BeginningOfQuarter(), "2017-10-01 00:00:00", "BeginningOfQuarter DST") assert(With(dstBeginningOfQuarter).BeginningOfHalf(), "2017-07-01 00:00:00", "BeginningOfHalf DST") assert(With(n.AddDate(0, -1, 0)).BeginningOfQuarter(), "2013-10-01 00:00:00", "BeginningOfQuarter") assert(With(n.AddDate(0, 1, 0)).BeginningOfQuarter(), "2013-10-01 00:00:00", "BeginningOfQuarter") assert(With(n.AddDate(0, 1, 0)).BeginningOfHalf(), "2013-07-01 00:00:00", "BeginningOfHalf") // DST assert(With(dstBeginningOfQuarter).BeginningOfYear(), "2017-01-01 00:00:00", "BeginningOfYear DST") assert(With(timeCaracas).BeginningOfYear(), "2016-01-01 00:00:00", "BeginningOfYear Caracas") } func TestEndOf(t *testing.T) { assert := assertT(t) n := time.Date(2013, 11, 18, 17, 51, 49, 123456789, time.UTC) assert(With(n).EndOfMinute(), "2013-11-18 17:51:59.999999999", "EndOfMinute") assert(With(n).EndOfHour(), "2013-11-18 17:59:59.999999999", "EndOfHour") assert(With(timeCaracas).EndOfHour(), "2016-01-01 12:59:59.999999999", "EndOfHour Caracas") assert(With(n).EndOfDay(), "2013-11-18 23:59:59.999999999", "EndOfDay") dstEndOfDay := time.Date(2017, 10, 29, 1, 0, 0, 0, locationBerlin) assert(With(dstEndOfDay).EndOfDay(), "2017-10-29 23:59:59.999999999", "EndOfDay DST") WeekStartDay = time.Tuesday assert(With(n).EndOfWeek(), "2013-11-18 23:59:59.999999999", "EndOfWeek, FirstDayTuesday") WeekStartDay = time.Wednesday assert(With(n).EndOfWeek(), "2013-11-19 23:59:59.999999999", "EndOfWeek, FirstDayWednesday") WeekStartDay = time.Thursday assert(With(n).EndOfWeek(), "2013-11-20 23:59:59.999999999", "EndOfWeek, FirstDayThursday") WeekStartDay = time.Friday assert(With(n).EndOfWeek(), "2013-11-21 23:59:59.999999999", "EndOfWeek, FirstDayFriday") WeekStartDay = time.Saturday assert(With(n).EndOfWeek(), "2013-11-22 23:59:59.999999999", "EndOfWeek, FirstDaySaturday") WeekStartDay = time.Sunday assert(With(n).EndOfWeek(), "2013-11-23 23:59:59.999999999", "EndOfWeek, FirstDaySunday") WeekStartDay = time.Monday assert(With(n).EndOfWeek(), "2013-11-24 23:59:59.999999999", "EndOfWeek, FirstDayMonday") dstEndOfWeek := time.Date(2017, 10, 24, 12, 0, 0, 0, locationBerlin) assert(With(dstEndOfWeek).EndOfWeek(), "2017-10-29 23:59:59.999999999", "EndOfWeek, FirstDayMonday") dstEndOfWeek = time.Date(2017, 10, 29, 12, 0, 0, 0, locationBerlin) assert(With(dstEndOfWeek).EndOfWeek(), "2017-10-29 23:59:59.999999999", "EndOfWeek, FirstDayMonday") WeekStartDay = time.Sunday assert(With(n).EndOfWeek(), "2013-11-23 23:59:59.999999999", "EndOfWeek") dstEndOfWeek = time.Date(2017, 10, 29, 0, 0, 0, 0, locationBerlin) assert(With(dstEndOfWeek).EndOfWeek(), "2017-11-04 23:59:59.999999999", "EndOfWeek") dstEndOfWeek = time.Date(2017, 10, 29, 12, 0, 0, 0, locationBerlin) assert(With(dstEndOfWeek).EndOfWeek(), "2017-11-04 23:59:59.999999999", "EndOfWeek") assert(With(n).EndOfMonth(), "2013-11-30 23:59:59.999999999", "EndOfMonth") assert(With(n).EndOfQuarter(), "2013-12-31 23:59:59.999999999", "EndOfQuarter") assert(With(n).EndOfHalf(), "2013-12-31 23:59:59.999999999", "EndOfHalf") assert(With(n.AddDate(0, -1, 0)).EndOfQuarter(), "2013-12-31 23:59:59.999999999", "EndOfQuarter") assert(With(n.AddDate(0, 1, 0)).EndOfQuarter(), "2013-12-31 23:59:59.999999999", "EndOfQuarter") assert(With(n.AddDate(0, 1, 0)).EndOfHalf(), "2013-12-31 23:59:59.999999999", "EndOfHalf") assert(With(n).EndOfYear(), "2013-12-31 23:59:59.999999999", "EndOfYear") n1 := time.Date(2013, 02, 18, 17, 51, 49, 123456789, time.UTC) assert(With(n1).EndOfMonth(), "2013-02-28 23:59:59.999999999", "EndOfMonth for 2013/02") n2 := time.Date(1900, 02, 18, 17, 51, 49, 123456789, time.UTC) assert(With(n2).EndOfMonth(), "1900-02-28 23:59:59.999999999", "EndOfMonth") } func TestMondayAndSunday(t *testing.T) { assert := assertT(t) n := time.Date(2013, 11, 19, 17, 51, 49, 123456789, time.UTC) n2 := time.Date(2013, 11, 24, 17, 51, 49, 123456789, time.UTC) nDst := time.Date(2017, 10, 29, 10, 0, 0, 0, locationBerlin) assert(With(n).Monday(), "2013-11-18 00:00:00", "Monday") assert(With(n2).Monday(), "2013-11-18 00:00:00", "Monday") assert(With(timeCaracas).Monday(), "2015-12-28 00:00:00", "Monday Caracas") assert(With(nDst).Monday(), "2017-10-23 00:00:00", "Monday DST") assert(With(n).Sunday(), "2013-11-24 00:00:00", "Sunday") assert(With(n2).Sunday(), "2013-11-24 00:00:00", "Sunday") assert(With(timeCaracas).Sunday(), "2016-01-03 00:00:00", "Sunday Caracas") assert(With(nDst).Sunday(), "2017-10-29 00:00:00", "Sunday DST") assert(With(n).EndOfSunday(), "2013-11-24 23:59:59.999999999", "EndOfSunday") assert(With(timeCaracas).EndOfSunday(), "2016-01-03 23:59:59.999999999", "EndOfSunday Caracas") assert(With(nDst).EndOfSunday(), "2017-10-29 23:59:59.999999999", "EndOfSunday DST") assert(With(n).BeginningOfWeek(), "2013-11-17 00:00:00", "BeginningOfWeek, FirstDayMonday") WeekStartDay = time.Monday assert(With(n).BeginningOfWeek(), "2013-11-18 00:00:00", "BeginningOfWeek, FirstDayMonday") } func TestParse(t *testing.T) { assert := assertT(t) n := time.Date(2013, 11, 18, 17, 51, 49, 123456789, time.UTC) assert(With(n).MustParse("2002"), "2002-01-01 00:00:00", "Parse 2002") assert(With(n).MustParse("2002-10"), "2002-10-01 00:00:00", "Parse 2002-10") assert(With(n).MustParse("2002-10-12"), "2002-10-12 00:00:00", "Parse 2002-10-12") assert(With(n).MustParse("2002-10-12 22"), "2002-10-12 22:00:00", "Parse 2002-10-12 22") assert(With(n).MustParse("2002-10-12 22:14"), "2002-10-12 22:14:00", "Parse 2002-10-12 22:14") assert(With(n).MustParse("2002-10-12 2:4"), "2002-10-12 02:04:00", "Parse 2002-10-12 2:4") assert(With(n).MustParse("2002-10-12 02:04"), "2002-10-12 02:04:00", "Parse 2002-10-12 02:04") assert(With(n).MustParse("2002-10-12 22:14:56"), "2002-10-12 22:14:56", "Parse 2002-10-12 22:14:56") assert(With(n).MustParse("2002-10-12 00:14:56"), "2002-10-12 00:14:56", "Parse 2002-10-12 00:14:56") assert(With(n).MustParse("2013-12-19 23:28:09.999999999 +0800 CST"), "2013-12-19 23:28:09.999999999", "Parse two strings 2013-12-19 23:28:09.999999999 +0800 CST") assert(With(n).MustParse("10-12"), "2013-10-12 00:00:00", "Parse 10-12") assert(With(n).MustParse("18"), "2013-11-18 18:00:00", "Parse 18 as hour") assert(With(n).MustParse("18:20"), "2013-11-18 18:20:00", "Parse 18:20") assert(With(n).MustParse("00:01"), "2013-11-18 00:01:00", "Parse 00:01") assert(With(n).MustParse("00:00:00"), "2013-11-18 00:00:00", "Parse 00:00:00") assert(With(n).MustParse("18:20:39"), "2013-11-18 18:20:39", "Parse 18:20:39") assert(With(n).MustParse("18:20:39", "2011-01-01"), "2011-01-01 18:20:39", "Parse two strings 18:20:39, 2011-01-01") assert(With(n).MustParse("2011-1-1", "18:20:39"), "2011-01-01 18:20:39", "Parse two strings 2011-01-01, 18:20:39") assert(With(n).MustParse("2011-01-01", "18"), "2011-01-01 18:00:00", "Parse two strings 2011-01-01, 18") TimeFormats = append(TimeFormats, "02 Jan 15:04") assert(With(n).MustParse("04 Feb 12:09"), "2013-02-04 12:09:00", "Parse 04 Feb 12:09 with specified format") assert(With(n).MustParse("23:28:9 Dec 19, 2013 PST"), "2013-12-19 23:28:09", "Parse 23:28:9 Dec 19, 2013 PST") if With(n).MustParse("23:28:9 Dec 19, 2013 PST").Location().String() != "PST" { t.Errorf("Parse 23:28:9 Dec 19, 2013 PST shouldn't lose time zone") } n2 := With(n).MustParse("23:28:9 Dec 19, 2013 PST") if With(n2).MustParse("10:20").Location().String() != "PST" { t.Errorf("Parse 10:20 shouldn't change time zone") } TimeFormats = append(TimeFormats, "2006-01-02T15:04:05.0") if MustParseInLocation(time.UTC, "2018-02-13T15:17:06.0").String() != "2018-02-13 15:17:06 +0000 UTC" { t.Errorf("ParseInLocation 2018-02-13T15:17:06.0") } TimeFormats = append(TimeFormats, "2006-01-02 15:04:05.000") assert(With(n).MustParse("2018-04-20 21:22:23.473"), "2018-04-20 21:22:23.473", "Parse 2018/04/20 21:22:23.473") TimeFormats = append(TimeFormats, "15:04:05.000") assert(With(n).MustParse("13:00:01.365"), "2013-11-18 13:00:01.365", "Parse 13:00:01.365") TimeFormats = append(TimeFormats, "2006-01-02 15:04:05.000000") assert(With(n).MustParse("2010-01-01 07:24:23.131384"), "2010-01-01 07:24:23.131384", "Parse 2010-01-01 07:24:23.131384") assert(With(n).MustParse("00:00:00.182736"), "2013-11-18 00:00:00.182736", "Parse 00:00:00.182736") n3 := MustParse("2017-12-11T10:25:49Z") if n3.Location() != time.UTC { t.Errorf("time location should be UTC, but got %v", n3.Location()) } } func TestBetween(t *testing.T) { tm := time.Date(2015, 06, 30, 17, 51, 49, 123456789, time.Now().Location()) if !With(tm).Between("23:28:9 Dec 19, 2013 PST", "23:28:9 Dec 19, 2015 PST") { t.Errorf("Between") } if !With(tm).Between("2015-05-12 12:20", "2015-06-30 17:51:50") { t.Errorf("Between") } } func TestConfig(t *testing.T) { assert := assertT(t) location, err := time.LoadLocation("Asia/Shanghai") if err != nil { t.Errorf("load location for Asia/Shanghai should returns no error, but got %v", err) } myConfig := Config{ WeekStartDay: time.Monday, TimeLocation: location, TimeFormats: []string{"2006-01-02 15:04:05"}, } n := time.Date(2013, 11, 18, 17, 51, 49, 123456789, time.Now().Location()) // // 2013-11-18 17:51:49.123456789 Mon assert(myConfig.With(n).BeginningOfWeek(), "2013-11-18 00:00:00", "BeginningOfWeek, FirstDayMonday") if result, _ := myConfig.Parse("2018-02-13 15:17:06"); result.String() != "2018-02-13 15:17:06 +0800 CST" { t.Errorf("ParseInLocation 2018-02-13T15:17:06.0, got %v", result) } if result := myConfig.MustParse("2018-02-13 15:17:06"); result.String() != "2018-02-13 15:17:06 +0800 CST" { t.Errorf("ParseInLocation 2018-02-13T15:17:06.0, got %v", result) } } func Example() { time.Now() // 2013-11-18 17:51:49.123456789 Mon BeginningOfMinute() // 2013-11-18 17:51:00 Mon BeginningOfHour() // 2013-11-18 17:00:00 Mon BeginningOfDay() // 2013-11-18 00:00:00 Mon BeginningOfWeek() // 2013-11-17 00:00:00 Sun WeekStartDay = time.Monday // Set Monday as first day BeginningOfWeek() // 2013-11-18 00:00:00 Mon BeginningOfMonth() // 2013-11-01 00:00:00 Fri BeginningOfQuarter() // 2013-10-01 00:00:00 Tue BeginningOfYear() // 2013-01-01 00:00:00 Tue EndOfMinute() // 2013-11-18 17:51:59.999999999 Mon EndOfHour() // 2013-11-18 17:59:59.999999999 Mon EndOfDay() // 2013-11-18 23:59:59.999999999 Mon EndOfWeek() // 2013-11-23 23:59:59.999999999 Sat WeekStartDay = time.Monday // Set Monday as first day EndOfWeek() // 2013-11-24 23:59:59.999999999 Sun EndOfMonth() // 2013-11-30 23:59:59.999999999 Sat EndOfQuarter() // 2013-12-31 23:59:59.999999999 Tue EndOfYear() // 2013-12-31 23:59:59.999999999 Tue // Use another time t := time.Date(2013, 02, 18, 17, 51, 49, 123456789, time.UTC) With(t).EndOfMonth() // 2013-02-28 23:59:59.999999999 Thu Monday() // 2013-11-18 00:00:00 Mon Sunday() // 2013-11-24 00:00:00 Sun EndOfSunday() // 2013-11-24 23:59:59.999999999 Sun } now-1.1.1/wercker.yml000066400000000000000000000005421355445153700145170ustar00rootroot00000000000000box: golang build: steps: - setup-go-workspace # Gets the dependencies - script: name: go get code: | go get # Build the project - script: name: go build code: | go build ./... # Test the project - script: name: go test code: | go test ./...