Mercurial > gemma
view pkg/common/time.go @ 4112:7959f62d3051
calculate scaling factor depending on DPI
author | Thomas Junk <thomas.junk@intevation.de> |
---|---|
date | Tue, 30 Jul 2019 16:31:21 +0200 |
parents | 80bdcd137a1d |
children | 8c5df0f3562e |
line wrap: on
line source
// This is Free Software under GNU Affero General Public License v >= 3.0 // without warranty, see README.md and license for details. // // SPDX-License-Identifier: AGPL-3.0-or-later // License-Filename: LICENSES/AGPL-3.0.txt // // Copyright (C) 2018, 2019 by via donau // – Österreichische Wasserstraßen-Gesellschaft mbH // Software engineering by Intevation GmbH // // Author(s): // * Sascha L. Teichmann <sascha.teichmann@intevation.de> // * Bernhard E. Reiter <bernhard.reiter@intevation.de> package common import ( "math" "time" ) const ( // time.RFC3339 equals "simplified ISO format as defined by ECMA-262" // https://tc39.github.io/ecma262/#sec-date-time-string-format // and "SHOULD be used in new protocols on the Internet." (RFC section 5.6) TimeFormat = time.RFC3339 TimeFormatMicro = "2006-01-02T15:04:05.999Z07:00" TimeFormatMicroLocal = "2006-01-02T15:04:05.000" DateFormat = "2006-01-02" ) // TimeParser is a list of time formats. type TimeParser []string var ParseTime = TimeParser{ TimeFormat, TimeFormatMicro, TimeFormatMicroLocal, DateFormat, }.Parse var utc0 = time.Unix(0, 0) // Parse tries to parse a given string by the entries of the layout // list one after another. The first matching time is returned. // If no layout matches the last error is returned or time zero // if the layout list is empty. func (tg TimeParser) Parse(s string) (time.Time, error) { var err error var t time.Time for _, layout := range tg { if t, err = time.Parse(layout, s); err == nil { break } } return t, err } func InterpolateTime(t1 time.Time, m1 float64, t2 time.Time, m2 float64) func(float64) time.Time { // f(m1) = t1 // f(m2) = t2 // t1 = m1*a + b <=> b = t1 - m1*a // t2 = m2*a + b // t1 - t2 = a*(m1 - m2) // a = (t1-t2)/(m1 - m2) for m1 != m2 if m1 == m2 { t := t1.Add(t2.Sub(t1) / 2) return func(float64) time.Time { return t } } a := t1.Sub(t2).Seconds() / (m1 - m2) b := t1.Sub(utc0).Seconds() - m1*a return func(m float64) time.Time { x := m*a + b secs := math.Ceil(x) nsecs := math.Ceil((x - secs) * (999999999 + 1)) return time.Unix(int64(secs), int64(nsecs)) } }