必须进行各种时间计算才能将当地时间转换为目的时间。本文将解释如何进行这些计算。
第一步:
事情的第一步是获得当地时间。在JavaScript中,这无疑可以通过初始化一个Data()对象来轻松完成。

// create Date object for current location 

 d = new Date(); 

 通过调用Data()对象的getTime()方法,即可显示1970年1月1日后到此当时时间之间的毫秒数。 

 // convert to msec since Jan 1 1970 

 localTime = d.getTime();



第二步:
下一步,通过Data()对象的getTimezoneOffset()方法来找出当地时间偏移值。在缺省情况下,此方法以分钟显示时区偏移值结果,因此在早先的计算中要将此值转换成毫秒。

// obtain local UTC offset and convert to msec 

 localOffset = d.getTimezoneOffset() * 60000;


注意,getTimezoneOffset()方法的负返回值表示当地时间在全球标准时间(UTC)之前,而正返回值则表示当地时间在全球标准时间(UTC)之后。
注意:万一你想知道我是如何得到60000这个倍增因数的,记住1000毫秒等于一秒,而一分钟等于60秒。因此 ,将分钟转换成毫秒,要用60乘以1000等于60000。

第三步
将本地时间与本地时区偏移值相加得到当前国际标准时间(UTC)。

// obtain UTC time in msec 

 utc = localTime + localOffset;


这里,变量utc包含当前国际标准时间(UTC)。但是,此时间以1970年1月1日到现在所含有的毫秒数来表示。暂时让它这样表示,因为还要进行一些计算。

第四步
得到国际标准时间(UTC)后,再获得目标城市的国际标准时间(UTC)小时偏移值,把它转换成毫秒,再加上国际标准时间(UTC)。

// obtain and add destination's UTC time offset 

 // for example, Bombay 

 // which is UTC + 5.5 hours 

 offset = 5.5; 

 bombay = utc + (3600000*offset);


注意:万一你想知道我是如何得到3600000这个倍增因数的,记住1000毫秒等于一秒,而一小时等于3600秒。因此 ,将小时转换成毫秒,要用3600乘以1000等于3600000。
此时,变量bombay包含印度孟买城的当地时间。此当地时间以1970年1月1日到现在所含有的毫秒数来表示。显然,这不是很合理,因此我们还要进行一些计算。

第五步
通过初始化一个新的Data()对象,并调用此对象的toLocalString()方法,我们将前一步中计算得到的时间值转换成一个大家可以看得懂的日期/时间字符串。

// convert msec value to date string 

 nd = new Date(bombay);  

 document.writeln("Bombay time is " + nd.toLocaleString() + "<br>");


这样转换就完成了!
总结
理解上面的步骤后,我们再看一看这段脚本(列表A),它建立一个紧凑,自定义的函数calcTime()来执行所有的计算并返回一个时间值。
列表A

 <
    
    html
    
    >
    
    

    
    <
    
    head
    
    >
    
    

    
    <
    
    script 
    
    language
    
    ="JavaScript"
    
    >
    
    

    
    //
    
     function to calculate local time
    
    
//
    
     in a different city
    
    
//
    
     given the city's UTC offset
    
    

    
    function
    
     calcTime(city, offset) {

    
    //
    
     create Date object for current location
    
    

    
    d 
    
    =
    
     
    
    new
    
     Date();

    
    //
    
     convert to msec
    
    
//
    
     add local time zone offset 
    
    
//
    
     get UTC time in msec
    
    

    
    utc 
    
    =
    
     d.getTime() 
    
    +
    
     (d.getTimezoneOffset() 
    
    *
    
     
    
    60000
    
    );

    
    //
    
     create new Date object for different city
    
    
//
    
     using supplied offset
    
    

    
    nd 
    
    =
    
     
    
    new
    
     Date(utc 
    
    +
    
     (
    
    3600000
    
    *
    
    offset));

    
    //
    
     return time as a string
    
    

    
    return
    
     
    
    "
    
    The local time in 
    
    "
    
     
    
    +
    
     city 
    
    +
    
     
    
    "
    
     is 
    
    "
    
     
    
    +
    
     nd.toLocaleString();
}

    
    //
    
     get Bombay time
    
    

    
    alert(calcTime(
    
    '
    
    Bombay
    
    '
    
    , 
    
    '
    
    +5.5
    
    '
    
    ));

    
    //
    
     get Singapore time
    
    

    
    alert(calcTime(
    
    '
    
    Singapore
    
    '
    
    , 
    
    '
    
    +8
    
    '
    
    ));

    
    //
    
     get London time
    
    

    
    alert(calcTime(
    
    '
    
    London
    
    '
    
    , 
    
    '
    
    +1
    
    '
    
    ));

    
    </
    
    script
    
    >
    
    

    
    </
    
    head
    
    >
    
    

    
    <
    
    body
    
    >
    
    

    
    </
    
    body
    
    >
    
    

    
    </
    
    html
    
    >


这里,函数calcTime()接受一个城市名及它的国际标准时间(UTC