...

Source file src/github.com/Azure/go-autorest/autorest/date/date.go

Documentation: github.com/Azure/go-autorest/autorest/date

     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  

View as plain text