Ticket Created
over 3 years ago

ACROPOLIS-3011, CASTOR-3047, VVA4-5395

Transferred

Gregorian.info() handles DST incorrectly for dates other than now/today (works in sim, not on device)

Related Issue

https://forums.garmin.com/developer/connect-iq/i/bug-reports/docs-for-gregorian-moment-imply-that-the-input-is-in-local-time-gregorian-info-and-utcinfo-suggest-otherwise

Description

Gregorian.info() handles DST incorrectly for dates other than now/today (works in sim, not on device).

In the sim, if I create a moment for some other date outside of the current DST/non-DST period, Gregorian.info() outputs local time correctly (with the correct adjustment/non-adjustment for DST).

On a real device, the same test will produce output which acts as if the supplied date is today, for the purpose of DST adjustment.

It's as if the device doesn't have/use TZ info for dates other than today, but the sim does.

(EDIT: of course, naturally this would work in the sim, as the underlying OS -- such as windows -- would have correct TZ/DST handling.)

Recreation Procedure

Create a simple data field with the following compute() method:

    function compute(info) {
        var timeInfo = new [2];
        var moment;

        // My timezone is Eastern Time
        // (On the current date (March 17), the timezone offset is UTC-4)
        //
        // On December 1, the timezone offset is UTC-5
        moment = Gregorian.moment({
            // despite docs, this input appears to be interpreted as UTC time
            :year   => 2021,
            :month  => 12,
            :day    => 1,
            :hour   => 16,
            :minutes => 0,
            :seconds => 0
        });
        timeInfo[0] = Gregorian.info(moment, Time.FORMAT_MEDIUM);

        // On July 1, the timezone offset is UTC-4
        moment = Gregorian.moment({
            // despite docs, this input appears to be interpreted as UTC time
            :year   => 2021,
            :month  => 7,
            :day    => 1,
            :hour   => 16,
            :minutes => 0,
            :seconds => 0
        });
        timeInfo[1] = Gregorian.info(moment, Time.FORMAT_MEDIUM);

        // On the sim this returns "Dec: 11 | July: 12", as expected
        //
        // On a real 935 this returns "Dec: 12 | July: 12". The TZ offset
        // seems to be calculated from the current time/date, not the given time/date
        return "Dec: " + timeInfo[0].hour + " | July: " + timeInfo[1].hour;
    }

On the sim this returns "Dec: 11 | July: 12", as expected. My timezone is Eastern Time, which is UTC-5 in December (DST) and UTC-4 in July (non-DST).

 On a real 935 this returns "Dec: 12 | July: 12". Today is March 17 and DST is active. The TZ offset used to calculate local time seems to be calculated from the current time/date, not the given time/date

Environment

- Windows 10

- VS Code

- SDK 3.2.5

- Garmin 935 21.00