首页 > 解决方案 > 如何在 ColdFusion 中获取时区的偏移量

问题描述

我需要在 Adob​​e ColdFusion 中获取任何给定时区的偏移量(以小时为单位)。这个想法是通过一个时区(美国/凤凰城)并在考虑夏令时的情况下取回它的偏移量。

好吧,在寻找似乎永远的东西之后,我意识到 CF 没有办法做到这一点。您需要深入研究它的下腹部 (JAVA) 以获得您需要的东西。因此,在 Ben Nadel 的一篇关于时区的帖子的帮助下,我想通了,并决定将我学到的知识传授给有一天可能需要它的开发者同行。

标签: timecoldfusionoffsetzone

解决方案


<cfscript>
    /*
    Author: Steve Holland (Avant Solutions Group)
    Website: www.avantsolutionsgroup.com
    License: https://opensource.org/licenses/MIT
    */
    private struct function calcTZOffset(required string timeZoneID, boolean returnTimezones="false") {
        // Init the timezome java class
        var tz = createObject( "java", "java.util.TimeZone" );

        // Get the timezone info
        var tzInfo = tz.getTimeZone(
            javaCast( "string", arguments.timeZoneID )
        );

        // Get the offset for the timezone
        var tzOffset = tzInfo.getOffset(
            javaCast("long", 0)
        );

        // Get the offset hours
        var tzOffsetHours = tzOffset / 3600000;

        //Check if the timezone is observing DST
        var inDST = tzInfo.observesDaylightTime();
        var tzOffsetHoursDST = inDST ? tzOffsetHours + 1 : tzOffsetHours;

        //Return
        var offset = {
            inDST = inDST,
            timeZone = arguments.timeZoneID,
            offsetMillis = tzOffset,
            offsetHours = tzOffsetHours,
            dstOffsetHours = tzOffsetHoursDST,
            timeZones = (arguments.returnTimezones)? tz.getAvailableIDs(): [] //Allow the user to return all the timezones (optional)
        };
        //writeOutput(tzOffset / 3600000);
        return offset;
    }

    tzID = "America/Denver";
    //tzID = "America/Phoenix";
    //tzID = "America/Los_Angeles";

    offset = calcTZOffset(tzID, false);

    //Dump out the results
    writeDump(var=offset);
</cfscript>

推荐阅读