Action

TimeZones

Posted by TheChels.uk, Last update 6 days ago

UPDATES

6 days ago

Typo

show all updates...

6 days ago

Typo

6 days ago

Updated script

6 days ago

Updated description

6 days ago

Description updated

About

Get timezones from a 24h local UK time. Given a time (24h 12:34 format) it adds list of common timezones around the world.

Tip

If you find this useful and want to support me, you can tip at ko-fi.com/thechelsuk

Steps

  • script

    
    /*
     * @title: Timezones
     * @author: TheChelsUk
     * @notes: creates list of timezones given a UK time 24h clock
     */
    
    // Get the first line (should contain time in HH:MM format)
    let lines = draft.content.split('\n');
    let timeString = lines[0].trim();
    
    // Validate time format (HH:MM in 24-hour format)
    let timeRegex = /^([0-1]?[0-9]|2[0-3]):([0-5][0-9])$/;
    let match = timeString.match(timeRegex);
    
    if (!match) {
        app.displayErrorMessage('First line must contain time in 24-hour format (e.g., 14:00)');
        context.fail();
    }
    
    let hours = parseInt(match[1]);
    let minutes = parseInt(match[2]);
    
    // Determine if UK is in GMT or BST
    // BST runs from last Sunday in March to last Sunday in October
    let now = new Date();
    let year = now.getFullYear();
    
    // Find last Sunday in March
    let marchLast = new Date(year, 2, 31);
    while (marchLast.getDay() !== 0) {
        marchLast.setDate(marchLast.getDate() - 1);
    }
    
    // Find last Sunday in October
    let octoberLast = new Date(year, 9, 31);
    while (octoberLast.getDay() !== 0) {
        octoberLast.setDate(octoberLast.getDate() - 1);
    }
    
    // Check if current date is in BST period
    let isBST = now >= marchLast && now < octoberLast;
    let ukOffset = isBST ? 1 : 0; // BST is GMT+1, GMT is GMT+0
    
    // Create a reference date in UK time
    let ukDate = new Date(Date.UTC(year, now.getMonth(), now.getDate(), hours - ukOffset, minutes));
    
    // Timezone definitions (offset from UTC)
    // Note: US timezones observe DST, so we need to check
    let isDST = now >= marchLast && now < octoberLast; // Approximate DST period for US
    
    let timezones = [
        // US Timezones
        { name: 'EST (New York)', offset: isDST ? -4 : -5, dst: isDST },
        { name: 'CST (Chicago)', offset: isDST ? -5 : -6, dst: isDST },
        { name: 'MST (Denver)', offset: isDST ? -6 : -7, dst: isDST },
        { name: 'PST (Los Angeles)', offset: isDST ? -7 : -8, dst: isDST },
        { name: 'AKST (Alaska)', offset: isDST ? -8 : -9, dst: isDST },
        { name: 'HST (Hawaii)', offset: -10, dst: false },
        
        // European
        { name: 'CET (Paris)', offset: isBST ? 2 : 1, dst: isBST },
        { name: 'EET (Athens)', offset: isBST ? 3 : 2, dst: isBST },
        
        // Asia
        { name: 'IST (Mumbai)', offset: 5.5, dst: false },
        { name: 'SGT (Singapore)', offset: 8, dst: false },
        { name: 'HKT (Hong Kong)', offset: 8, dst: false },
        { name: 'JST (Tokyo)', offset: 9, dst: false },
        { name: 'AEST (Sydney)', offset: isDST ? 11 : 10, dst: isDST },
        
        // Middle East
        { name: 'GST (Dubai)', offset: 4, dst: false },
        
        // Others
        { name: 'UTC', offset: 0, dst: false },
    ];
    
    // Build output
    let output = timeString + ' ' + (isBST ? 'BST' : 'GMT') + '\n\n';
    
    timezones.forEach(tz => {
        let convertedDate = new Date(ukDate.getTime() + (tz.offset * 60 * 60 * 1000));
        let convertedHours = convertedDate.getUTCHours();
        let convertedMinutes = convertedDate.getUTCMinutes();
        
        // Format time
        let timeStr = String(convertedHours).padStart(2, '0') + ':' + String(convertedMinutes).padStart(2, '0');
        
        output += '- ' + timeStr + ' - ' + tz.name + '\n';
    });
    
    // Replace first line or add to draft
    if (lines.length > 1) {
        lines[0] = output.trim();
        draft.content = lines.join('\n');
    } else {
        draft.content = output;
    }
    
    draft.update();
    
    app.displaySuccessMessage('Timezones added');

Options

  • After Success Default
    Notification Info
    Log Level Info
Items available in the Drafts Directory are uploaded by community members. Use appropriate caution reviewing downloaded items before use.