1 /* 2 Package date provides time.Time derivatives that conform to the Swagger.io (https://swagger.io/) 3 defined date formats: Date and DateTime. Both types may, in most cases, be used in lieu of 4 time.Time types. And both convert to time.Time through a ToTime method. 5 */ 6 package date 7 8 // Copyright 2017 Microsoft Corporation 9 // 10 // Licensed under the Apache License, Version 2.0 (the "License"); 11 // you may not use this file except in compliance with the License. 12 // You may obtain a copy of the License at 13 // 14 // http://www.apache.org/licenses/LICENSE-2.0 15 // 16 // Unless required by applicable law or agreed to in writing, software 17 // distributed under the License is distributed on an "AS IS" BASIS, 18 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 // See the License for the specific language governing permissions and 20 // limitations under the License. 21 22 import ( 23 "fmt" 24 "time" 25 ) 26 27 const ( 28 fullDate = "2006-01-02" 29 fullDateJSON = `"2006-01-02"` 30 dateFormat = "%04d-%02d-%02d" 31 jsonFormat = `"%04d-%02d-%02d"` 32 ) 33 34 // Date defines a type similar to time.Time but assumes a layout of RFC3339 full-date (i.e., 35 // 2006-01-02). 36 type Date struct { 37 time.Time 38 } 39 40 // ParseDate create a new Date from the passed string. 41 func ParseDate(date string) (d Date, err error) { 42 return parseDate(date, fullDate) 43 } 44 45 func parseDate(date string, format string) (Date, error) { 46 d, err := time.Parse(format, date) 47 return Date{Time: d}, err 48 } 49 50 // MarshalBinary preserves the Date as a byte array conforming to RFC3339 full-date (i.e., 51 // 2006-01-02). 52 func (d Date) MarshalBinary() ([]byte, error) { 53 return d.MarshalText() 54 } 55 56 // UnmarshalBinary reconstitutes a Date saved as a byte array conforming to RFC3339 full-date (i.e., 57 // 2006-01-02). 58 func (d *Date) UnmarshalBinary(data []byte) error { 59 return d.UnmarshalText(data) 60 } 61 62 // MarshalJSON preserves the Date as a JSON string conforming to RFC3339 full-date (i.e., 63 // 2006-01-02). 64 func (d Date) MarshalJSON() (json []byte, err error) { 65 return []byte(fmt.Sprintf(jsonFormat, d.Year(), d.Month(), d.Day())), nil 66 } 67 68 // UnmarshalJSON reconstitutes the Date from a JSON string conforming to RFC3339 full-date (i.e., 69 // 2006-01-02). 70 func (d *Date) UnmarshalJSON(data []byte) (err error) { 71 d.Time, err = time.Parse(fullDateJSON, string(data)) 72 return err 73 } 74 75 // MarshalText preserves the Date as a byte array conforming to RFC3339 full-date (i.e., 76 // 2006-01-02). 77 func (d Date) MarshalText() (text []byte, err error) { 78 return []byte(fmt.Sprintf(dateFormat, d.Year(), d.Month(), d.Day())), nil 79 } 80 81 // UnmarshalText reconstitutes a Date saved as a byte array conforming to RFC3339 full-date (i.e., 82 // 2006-01-02). 83 func (d *Date) UnmarshalText(data []byte) (err error) { 84 d.Time, err = time.Parse(fullDate, string(data)) 85 return err 86 } 87 88 // String returns the Date formatted as an RFC3339 full-date string (i.e., 2006-01-02). 89 func (d Date) String() string { 90 return fmt.Sprintf(dateFormat, d.Year(), d.Month(), d.Day()) 91 } 92 93 // ToTime returns a Date as a time.Time 94 func (d Date) ToTime() time.Time { 95 return d.Time 96 } 97