JS/Java 中任何城市的夏令时时间

Posted

技术标签:

【中文标题】JS/Java 中任何城市的夏令时时间【英文标题】:Time with DST for any city in JS/Java 【发布时间】:2015-05-22 04:36:31 【问题描述】:

我想要一个可以按以下方式工作的代码。 应自动处理夏令时的8-10个城市的显示时间。

For example : Melbourne observes DST, a API using which I can fetch the current time based on location without any hardcode done for DST calculation.

目前正在运行的代码基于硬编码值。它选择系统时间转换为 GMT,然后根据位置添加/减去偏移量。

然后根据日期计算 DST 并适当添加。

但我想使用一些 API 来删除硬编码的值,我正在尝试使用下面的代码。

The below code giving time for IST/GMT, but when I put AEST/AEDT it doesnt give the correct time.


public class DateFormatter 

    public static String formatDateToString(Date date, String format,
            String timeZone) 
        // null check
        if (date == null) return null;
        // create SimpleDateFormat object with input format
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        // default system timezone if passed null or empty
        if (timeZone == null || "".equalsIgnoreCase(timeZone.trim())) 
            timeZone = Calendar.getInstance().getTimeZone().getID();
        
        // set timezone to SimpleDateFormat
        sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
        // return Date in required format with timezone as String
        return sdf.format(date);
    

    public static void main(String[] args) 
        //Test formatDateToString method
        Date date = new Date();
        System.out.println("Default Date:"+date.toString());
        System.out.println("System Date: "+formatDateToString(date, "dd MMM yyyy hh:mm:ss a", null));
        System.out.println("System Date in PST: "+formatDateToString(date, "dd MMM yyyy hh:mm:ss a", "PST"));
        System.out.println("System Date in IST: "+formatDateToString(date, "dd MMM yyyy hh:mm:ss a", "IST"));
        System.out.println("System Date in GMT: "+formatDateToString(date, "dd MMM yyyy hh:mm:ss a", "GMT"));
        System.out.println("System Date in CT: "+formatDateToString(date, "dd MMM yyyy hh:mm:ss a", "BDT"));
    


【问题讨论】:

不要使用CalendarDate。使用 java 8 time API 或 jodatime。 我工作的服务器没有 Java 8,我们目前只使用 Java 6,所以请相应地提出建议 嗨,安迪,你有任何关于区域的例子吗?我用过它,它给了我时间,ISO 格式没有转换为 UTC 您可以使用DateTimeZone.forID 获取特定区域的DateTimeZone 实例。请注意,您可能需要使用比 3 个字母更好的时区名称,例如CST 是模棱两可的。您可以使用new DateTime() 获取当前时间,然后通过调用dateTimeInstance.withZone(dateTimeZoneInstance) 将其转换为不同的时区 【参考方案1】:
import java.time.LocalTime;
import java.time.ZoneId;

public class Main 
  public static void main(String... args) 
        ZoneId zone2 = ZoneId.of("America/Santiago");
     LocalTime now2 = LocalTime.now(zone2);
    System.out.println(now2);
  


Use the below link to know the timezones

http://joda-time.sourceforge.net/timezones.html

【讨论】:

但是上面的代码在Java8中可以工作,有谁知道java6的解决方案【参考方案2】:
package com.java.test;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

import javax.swing.text.ZoneView;

public class TestJavaCode 

/**
* @param args
*/
public static void main(String[] args) 
// TODO Auto-generated method stub
try

Calendar cal = GregorianCalendar.getInstance();
TimeZone tzone = cal.getTimeZone();
tzone.useDaylightTime();
System.out.println("Timezone:"+tzone.getDisplayName());


TimeZone tzone1 = TimeZone.getTimeZone("Canada/Central");
TimeZoneIDProvide.getTimeZoneID(TimeZoneID.US_EASTERN).getTimeZone();

Calendar cal1 = new GregorianCalendar(tzone1); 
cal1.setTimeInMillis(cal.getTimeInMillis());

System.out.println("Time in US Hour: "+cal1.get(Calendar.HOUR));
System.out.println("Time in US Min: "+cal1.get(Calendar.MINUTE));
System.out.println("Time in US Sec: "+cal1.get(Calendar.SECOND));




catch(Exception e)

System.out.println("Exception caught:"+e);





【讨论】:

以上是关于JS/Java 中任何城市的夏令时时间的主要内容,如果未能解决你的问题,请参考以下文章

查找给定城市的 UTC 偏移量

在 Javascript 中使用夏令时检查日期范围

UTC 时间、时区、夏令时和夏令时切换日期

在计算 DateTimes 之间的持续时间时安全处理夏令时(或任何其他理论上的非常量偏移)

夏令时时间差距/重叠定义?啥时候为他们“纠正”?

如何获取另一个时区的夏令时状态