Help us shape the future of Go! Take the 2026 Go Developer Survey

compact_time

package module
v1.3.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 16, 2020 License: MIT Imports: 4 Imported by: 11

README

Compact Time

A go implementation of compact time.

Library Usage

func demonstrateEncode() {
	location, err := time.LoadLocation("Asia/Singapore")
	if err != nil {
		// TODO: Handle error
	}
	goDate := time.Date(2020, time.Month(8), 30, 15, 33, 14, 19577323, location)
	compactDate := compact_date.AsCompactTime(goDate)
	buffer := make([]byte, compact_date.EncodedSize(compactDate))
	encodedCount, ok := compact_date.Encode(compactDate, buffer)
	if !ok {
		// TODO: Not enough room in buffer to encode
	}
	fmt.Printf("Encoded [%v] into %v bytes: %v\n", goDate, encodedCount, buffer)
	// Prints: Encoded [2020-08-30 15:33:14.019577323 +0800 +08] into 21 bytes: [95 207 85 9 156 240 121 68 1 22 83 47 83 105 110 103 97 112 111 114 101]
}

func demonstrateDecode() {
	buffer := []byte{0x28, 0x9a, 0x12, 0x78, 0x08}
	compactDate, decodedCount, err := compact_date.DecodeTimestamp(buffer)
	if err != nil {
		// TODO: Check if is compact_time.ErrorIncomplete or something else
	}
	if err := compactDate.Validate(); err != nil {
		// TODO: Handle error
	}
	goDate, err := compactDate.AsGoTime()
	if err != nil {
		// TODO: Handle error
	}
	fmt.Printf("Decoded %v bytes of %v into [%v]\n", decodedCount, buffer, goDate)
	// Prints: Decoded 5 bytes of [40 154 18 120 8] into [1966-12-01 05:13:05 +0000 UTC]
}

License

MIT License:

Copyright 2019 Karl Stenerud

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.

Documentation

Overview

Package compact_time provides encoding and decoding mechanisms for the compact time format (https://github.com/kstenerud/compact-time), as well as basic conversion functions to/from the go time package.

Basic validation is performed when decoding data, enough to ensure that it isn't blatantly wrong (such as invalid area/location values, latitude 500, december 54th, etc). However, it does not do more nuanced checks such as on which years February 29th is valid, or when leap seconds are allowed. It also doesn't check for impossible timestamp values such as 2011-03-13/02:10:00/Los_Angeles.

Index

Constants

View Source
const (
	TypeDate = TimeType(iota)
	TypeTime
	TypeTimestamp
)
View Source
const (
	TypeUTC = TimezoneType(iota)
	TypeAreaLocation
	TypeLatitudeLongitude
)
View Source
const MaxEncodeLength = 50

Maximum byte length that this library will encode

Variables

View Source
var ErrorIncomplete = fmt.Errorf("Compact time value is incomplete")

Functions

func Encode added in v1.0.1

func Encode(time *Time, dst []byte) (bytesEncoded int, isComplete bool)

Encode a time value (date, time, or timestamp). Returns the number of bytes encoded, or the number of bytes it attempted to encode. Returns isComplete=true if there was enough room in dst. Returns an error if something went wrong other than there not being enough room.

func EncodedSize added in v1.0.1

func EncodedSize(time *Time) int

Get the number of bytes that would be required to encode this time value.

Types

type Time added in v1.0.1

type Time struct {
	Year                int
	Nanosecond          uint32
	LatitudeHundredths  int16
	LongitudeHundredths int16
	Month               uint8
	Day                 uint8
	Hour                uint8
	Minute              uint8
	Second              uint8
	TimeIs              TimeType
	TimezoneIs          TimezoneType
	AreaLocation        string
}

func AsCompactTime added in v1.0.1

func AsCompactTime(src gotime.Time) (result *Time)

func DecodeDate

func DecodeDate(src []byte) (time *Time, bytesDecoded int, err error)

Decode a date. Warning: The date fields will not be validated! Please call time.Validate()! Returns the number of bytes decoded, or the number of bytes it attempted to decode. Returns isComplete=true if there was enough data in src. If isComplete == false, the resulting date is invalid.

func DecodeTime

func DecodeTime(src []byte) (time *Time, bytesDecoded int, isComplete bool)

Decode a time value. Warning: The date fields will not be validated! Please call time.Validate()! Returns the number of bytes decoded, or the number of bytes it attempted to decode. Returns isComplete=true if there was enough data in src. If isComplete == false, the resulting time value is invalid.

func DecodeTimestamp

func DecodeTimestamp(src []byte) (time *Time, bytesDecoded int, err error)

Decode a timestamp. Warning: The date fields will not be validated! Please call time.Validate()! Returns the number of bytes decoded, or the number of bytes it attempted to decode. Returns isComplete=true if there was enough data in src. If isComplete == false, the resulting timestamp is invalid.

func NewDate added in v1.0.1

func NewDate(year, month, day int) *Time

func NewTime added in v1.0.1

func NewTime(hour, minute, second, nanosecond int, areaLocation string) *Time

Create a new time. If areaLocation is empty, UTC is assumed.

func NewTimeLatLong added in v1.0.1

func NewTimeLatLong(hour, minute, second, nanosecond, latitudeHundredths, longitudeHundredths int) *Time

func NewTimestamp added in v1.0.1

func NewTimestamp(year, month, day, hour, minute, second, nanosecond int, areaLocation string) *Time

Create a new timestamp. If areaLocation is empty, UTC is assumed.

func NewTimestampLatLong added in v1.0.1

func NewTimestampLatLong(year, month, day, hour, minute, second, nanosecond, latitudeHundredths, longitudeHundredths int) *Time

func (*Time) AsGoTime added in v1.0.1

func (this *Time) AsGoTime() (result gotime.Time, err error)

Convert this time into a standard go time. Note: Go time doesn't support latitude/longitude time zones. Attempting to

convert this type of time zone will result in an error.

func (*Time) InitDate added in v1.0.1

func (this *Time) InitDate(year, month, day int)

func (*Time) InitTime added in v1.0.1

func (this *Time) InitTime(hour, minute, second, nanosecond int, areaLocation string)

Init a time. If areaLocation is empty, UTC is assumed.

func (*Time) InitTimeLatLong added in v1.0.1

func (this *Time) InitTimeLatLong(hour, minute, second, nanosecond, latitudeHundredths, longitudeHundredths int)

func (*Time) InitTimestamp added in v1.0.1

func (this *Time) InitTimestamp(year, month, day, hour, minute, second, nanosecond int, areaLocation string)

Init a timestamp. If areaLocation is empty, UTC is assumed.

func (*Time) InitTimestampLatLong added in v1.0.1

func (this *Time) InitTimestampLatLong(year, month, day, hour, minute, second, nanosecond, latitudeHundredths, longitudeHundredths int)

func (*Time) String added in v1.3.0

func (this *Time) String() string

func (*Time) Validate added in v1.0.1

func (this *Time) Validate() (err error)

Validate this time. Only basic validation is performed, enough to ensure that it isn't blatantly wrong (such as invalid area/location values, latitude 500, december 54th, etc). It does not do more nuanced checks such as on which years February 29th is valid, or when leap seconds are allowed. It also doesn't check for impossible timestamp values such as 2011-03-13/02:10:00/Los_Angeles.

Note: The field AreaLocation is not validated. You can validate this field using time.LoadLocation() or time.LoadLocationFromTZData().

type TimeType added in v1.0.1

type TimeType uint8

type TimezoneType added in v1.0.1

type TimezoneType uint8

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL