Echo JS 0.11.0

<~>

tracker1 1154 days ago. link 1 point
Seems like there could be some interesting uses.. but as it stands, the README doesn't match the interfaces, and playing with it on RunKit, I couldn't manage to get it working.

What I'd really like to do, would be to parse a given date as a TimeZone...

for examples:

    // local date, but not the right timezone
    var dtm = new Date('2021-02-21T15:00:00');

    // will now be local time on the host.
    var fixed = global.parseWithTimezone(
      '2021-02-21T15:00:00',
      'America/Phoenix'
    );

    // correct UTC value from date time as Phoenix time.
    fixed.toJSON(); // 2021-02-21T22:00:00.000Z


aside: This uses `moment` and `moment-timezone` which you should never use in the browser if you can avoid it.. these libraries are MASSIVE.
tracker1 1154 days ago. link 1 point
Looks like I can do what I need with tz-offset, which is only ~18k unpacked compared to close to moment/moment-timezone which are MASSIVE.

    var tzOffset = require("tz-offset")

    function todayAtTime(input /*17:00*/) {
      const now = new Date();
      const y = now.getFullYear();
      const m = `0${now.getMonth() + 1}`.substr(-2);
      const d = `0${now.getDate()}`.substr(-2);
      
      const ret = `${y}-${m}-${d}T${input}`;
      return ret;
    }

    function inDst(dtm) {
        const dstStart = new Date(dtm.getFullYear(), 2/*Mar*/, 14, 2);
        const dstEnd = new Date(dtm.getFullYear(), 10/*Nov*/, 7, 3);
        return (dtm < dstStart || dtm > dstEnd);
    }

    function parseAsTimezone(input, timezone, noDst) {
        const dtm = new Date(input);
        dtm.setMinutes(
            dtm.getMinutes() 
            + (-1 * dtm.getTimezoneOffset())
            + tzOffset.offsetOf(timezone)
        );
        
        const dstStart = new Date(dtm.getFullYear(), 2/*Mar*/, 14, 2);
        const dstEnd = new Date(dtm.getFullYear(), 10/*Nov*/, 7, 3)
        
        if (noDst) return dtm;
        
        switch (timezone) {
            case "America/Phoenix":
                // todo: other timezones without dst    
                break;
            default:
                if (inDst(dtm)) {
                    dtm.setHours(dtm.getHours() - 1);
                }
        }
        return dtm;
    }

    function todayAtTimezone(time, timezone) {
      return parseAsTimezone(todateAtTime(time), timezone);
    }

    // Phoenix same as Denver
    console.log(parseAsTimezone('2021-01-01T15:00:00','America/Los_Angeles').toJSON());
    console.log(parseAsTimezone('2021-01-01T15:00:00','America/Denver').toJSON());
    console.log(parseAsTimezone('2021-01-01T15:00:00','America/Phoenix').toJSON());


    // Phoenix same as LA
    console.log(parseAsTimezone('2021-05-01T15:00:00','America/Los_Angeles').toJSON());
    console.log(parseAsTimezone('2021-05-01T15:00:00','America/Denver').toJSON());
    console.log(parseAsTimezone('2021-05-01T15:00:00','America/Phoenix').toJSON());

    // Getting the Time set for a give IATA timezone TODAY
    console.log(todayAtTimezone('15:00', 'America/Los_Angeles').toJSON())
    console.log(todayAtTimezone('15:00', 'America/Denver').toJSON())
    console.log(todayAtTimezone(‘15:00', 'America/Phoenix').toJSON())