-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Description
What version of Go are you using (go version
)?
$ go version
go version go1.17.3 linux/amd64
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (go env
)?
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/hugo/.cache/go-build"
GOENV="/home/hugo/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/hugo/.cache/golang/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/hugo/.cache/golang"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.17.3"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1388033309=/tmp/go-build -gno-record-gcc-switches"
What did you do?
Trying to create an instance of time.Location
based on data read from an iCalendar file.
What did you expect to see?
Some way to construct a time.Location
instance.
What did you see instead?
No public function to create such an instance; time.Location
instances can only be created with time.LoadLocationFromTZData
.
More background
We're trying to parse iCalendar files, which contain VTIMEZONE
entries, which represent a timezone (time.Location
in go).
However, there's no public function to create time.Location
instances, and the only way to create them is using using IANA Time Zone database-formatted data, which is a rather complex binary format.
So currently, the only way to create time.Location
entries for the timezones read, is to convert them into the above mentioned binary format, and then feed that into time.LoadLocationFromTZData
.
This has two big problems: (1) it's very complex to convert VTIMEZONE
data into that binary format, and also, needless complexity (2) it's very inefficient, since every entry read has to be converted into an intermediate representation, to then be parsed again and then converted into the final one.
Making the time.zone
and time.zoneTrans
public (e.g.: renaming them into time.Zone
and time.ZoneTrans
, plus adding a time.LocationFromZoneInfo(name string, zones []Zone, zoneTrans []ZoneTrans) Location
function would very much help address this issue.
I'd be happy to try and tackle the implementation myself, if the approach seems sound, but I figure it's best to ask for feedback on that first; it's possible that someone has cleaner approaches to solving this issue, or that this breaks some existing convention.
As an alternative approach, a function that takes a string with an RFC-5545 compliant VTIMEZONE
and returns a time.Location
instance might be a cleaner API, but I'm not sure if adding iCalendar-specific code into this package would be deemed acceptable.