[TypeScript][Moment] Change timezone

Intro
Sometimes I join online events.
But I don't know when those events will start because the timezone is different from Japan (I live in Japan).
So this time I will try converting.
Environments
  • Node.js ver.16.4.2
  • TypeScript ver.4.3.5
  • moment ver.2.29.1
  • moment-timezone ver.0.5.33
  • ts-loader ver.9.2.3
  • webpack ver.5.42.0
  • webpack-cli ver.4.7.2
  • Get my own timezone
    For getting my own timezone, I just create a Date instance.
    const currentDate = new Date();
    console.log(currentDate);
    Result
    Sun Jul 11 2021 08:39:08 GMT+0900 (Japan Standard Time)
    The timezone came from OS settings.
    So if I change them, the result will be changed.
    Convert timezone to my own one?
    I can create Data instances by formatted string.
    const currentDate = new Date('Jul 10 2021 19:48 EDT');
    console.log(currentDate);
    Result
    Sun Jul 11 2021 08:48:00 GMT+0900 (Japan Standard Time)
    I was able to implement everything I wanted to achieve...?
    Daylight Saving Time(Summer time)
    Because there are "Daylight Saving Time" in some countries, I must change their timezone according the date.
    For example, if the date is "2021-03-13", I must use "EST". But if the date is "2021-03-15", I must use "EDT".
    The problem is the dates when "Daylight Saving Time" start aren't same in every year.
    After all, I used "moment" and "moment-timezone".
    Because I can't specify the time zone like "EDT" and "America / EDT", I select cities that belong to that timezone and map the names.
    index.html
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <title>Convert sample</title>
            <meta charset="utf-8">
        </head>
        <body>
            <input type="date" id="convert_date_from" placeholder="Date From">
            <select id="convert_hour_from"></select>
            <select id="convert_minute_from"></select>
            <input type="text" id="convert_timezone_from" list="convert_timezone_from_list">
                <datalist id="convert_timezone_from_list">
    
                </datalist>
            <button onclick="Page.convert()">Convert</button>
            <div id="convert_date_to"></div>
            <script src="js/main.page.js"></script>
        </body>
    </html>
    main.page.ts
    import moment from "moment";
    import tz from 'moment-timezone';
    
    type TimezoneValue = {
        displayName: string,
        value: string
    };
    const timezoneValueList: TimezoneValue[] = [
        { displayName: 'US/ET', value: 'America/New_York'},
        { displayName: 'US/CT', value: 'America/Chicago' },
        { displayName: 'US/PT', value: 'America/Los_Angeles' },
        { displayName: 'Japan', value: 'Asia/Tokyo' },
    ];
    function init() {
        addHour();
        addMinute();
        addTimezone();
    }
    function addHour() {
        const hourInput = document.getElementById('convert_hour_from') as HTMLSelectElement;
        for(let i = 0; i < 24; i++) {
            const hourValue = document.createElement('option');
            const value = ("00"+ i).slice (-2);
            hourValue.text = value;
            hourValue.value = value;
            hourInput.appendChild(hourValue);
        }
    }
    function addMinute() {
        const minuteInput = document.getElementById('convert_minute_from') as HTMLSelectElement;
        for(let i = 0; i < 60; i++) {
            const minuteValue = document.createElement('option');
            const value = ("00"+ i).slice (-2);
            minuteValue.text = value;
            minuteValue.value = value;
            minuteInput.appendChild(minuteValue);
        }
    }
    function addTimezone() {
        const timezoneList = document.getElementById('convert_timezone_from_list') as HTMLDataListElement;
        for(const value of timezoneValueList) {
            const timezoneValue = document.createElement('option');
            timezoneValue.value = value.displayName;
            timezoneList.appendChild(timezoneValue);
        }
    }
    export function convert() {
        const dateInput = document.getElementById('convert_date_from') as HTMLInputElement;
        const hourInput = document.getElementById('convert_hour_from') as HTMLSelectElement;
        const minuteInput = document.getElementById('convert_minute_from') as HTMLSelectElement;
        const timezoneInput = document.getElementById('convert_timezone_from') as HTMLInputElement;
    
        const date = moment(dateInput.value).format('YYYY-MM-DD');
        const hour = hourInput.options[hourInput.selectedIndex].value;
        const minute = minuteInput.options[minuteInput.selectedIndex].value;
        const datetimeText = `${date} ${hour}:${minute}`;
    
        const timezone = timezoneValueList.find(t => t.displayName === timezoneInput.value);
        const targetTime =  momentTz.tz(datetimeText, timezone!.value);
    
        const dateOutput = document.getElementById('convert_date_to') as HTMLElement;
        dateOutput.textContent = moment(targetTime.toDate()).format('YYYY-MM-DD HH:mm');
    }
    init();

    38

    This website collects cookies to deliver better user experience

    [TypeScript][Moment] Change timezone