/* Package date provides time.Time derivatives that conform to the Swagger.io (https://swagger.io/) defined date formats: Date and DateTime. Both types may, in most cases, be used in lieu of time.Time types. And both convert to time.Time through a ToTime method. */ package date // Copyright 2017 Microsoft Corporation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import ( "fmt" "time" ) const ( fullDate = "2006-01-02" fullDateJSON = `"2006-01-02"` dateFormat = "%04d-%02d-%02d" jsonFormat = `"%04d-%02d-%02d"` ) // Date defines a type similar to time.Time but assumes a layout of RFC3339 full-date (i.e., // 2006-01-02). type Date struct { time.Time } // ParseDate create a new Date from the passed string. func ParseDate(date string) (d Date, err error) { return parseDate(date, fullDate) } func parseDate(date string, format string) (Date, error) { d, err := time.Parse(format, date) return Date{Time: d}, err } // MarshalBinary preserves the Date as a byte array conforming to RFC3339 full-date (i.e., // 2006-01-02). func (d Date) MarshalBinary() ([]byte, error) { return d.MarshalText() } // UnmarshalBinary reconstitutes a Date saved as a byte array conforming to RFC3339 full-date (i.e., // 2006-01-02). func (d *Date) UnmarshalBinary(data []byte) error { return d.UnmarshalText(data) } // MarshalJSON preserves the Date as a JSON string conforming to RFC3339 full-date (i.e., // 2006-01-02). func (d Date) MarshalJSON() (json []byte, err error) { return []byte(fmt.Sprintf(jsonFormat, d.Year(), d.Month(), d.Day())), nil } // UnmarshalJSON reconstitutes the Date from a JSON string conforming to RFC3339 full-date (i.e., // 2006-01-02). func (d *Date) UnmarshalJSON(data []byte) (err error) { d.Time, err = time.Parse(fullDateJSON, string(data)) return err } // MarshalText preserves the Date as a byte array conforming to RFC3339 full-date (i.e., // 2006-01-02). func (d Date) MarshalText() (text []byte, err error) { return []byte(fmt.Sprintf(dateFormat, d.Year(), d.Month(), d.Day())), nil } // UnmarshalText reconstitutes a Date saved as a byte array conforming to RFC3339 full-date (i.e., // 2006-01-02). func (d *Date) UnmarshalText(data []byte) (err error) { d.Time, err = time.Parse(fullDate, string(data)) return err } // String returns the Date formatted as an RFC3339 full-date string (i.e., 2006-01-02). func (d Date) String() string { return fmt.Sprintf(dateFormat, d.Year(), d.Month(), d.Day()) } // ToTime returns a Date as a time.Time func (d Date) ToTime() time.Time { return d.Time }