转换指定时区的日期/时间

我想将此GMT时间戳转换为GMT + 13:

2011-10-06 03:35:05

我尝试过大约100种不同的DateFormat,TimeZone,Date,GregorianCalendar等组合来尝试做这个非常基本的任务。

此代码完成我想要的CURRENT TIME:

Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));

DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");    
formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));  

String newZealandTime = formatter.format(calendar.getTime());

但我想要的是设定时间,而不是使用当前时间。

我发现任何时候我都会尝试设置这样的时间:

calendar.setTime(new Date(1317816735000L));

本地计算机的TimeZone被使用。 这是为什么? 我知道当“新Date()”返回UTC + 0时,为什么当你设置时间以毫秒为单位时,它不再认为时间是UTC?

有可能:

  • 在对象上设置时间(日历/日期/时间戳)
  • (可能)设置初始时间戳的时区(calendar.setTimeZone(...))
  • 使用新的TimeZone格式化时间戳(formatter.setTimeZone(...)))
  • 以新的时区时间返回一个字符串。 (formatter.format(calendar.getTime()))
  • 预先感谢您的帮助:D


    了解计算机时间的工作原理非常重要。 有了这个说法,我同意如果创建一个API来帮助您像实时一样处理计算机时间,那么它应该以允许您像实时一样对待它的方式工作。 在大多数情况下,情况确实如此,但仍有一些需要关注的重大疏漏。

    无论如何,我离题! 如果您有UTC偏移量(最好以UTC格式工作而不是GMT偏移量),则可以计算以毫秒为单位的时间并将其添加到您的时间戳中。 请注意,SQL时间戳可能与Java时间戳有所不同,因为计算历元时间的方式并不总是相同 - 这取决于数据库技术和操作系统。

    我建议你使用System.currentTimeMillis()作为时间戳,因为这些可以在java中更加一致地处理,而不用担心将SQL时间戳转换为java日期对象等。

    为了计算你的抵消,你可以尝试这样的事情:

    Long gmtTime =1317951113613L; // 2.32pm NZDT
    Long timezoneAlteredTime = 0L;
    
    if (offset != 0L) {
        int multiplier = (offset*60)*(60*1000);
        timezoneAlteredTime = gmtTime + multiplier;
    } else {
        timezoneAlteredTime = gmtTime;
    }
    
    Calendar calendar = new GregorianCalendar();
    calendar.setTimeInMillis(timezoneAlteredTime);
    
    DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
    
    formatter.setCalendar(calendar);
    formatter.setTimeZone(TimeZone.getTimeZone(timeZone));
    
    String newZealandTime = formatter.format(calendar.getTime());
    

    我希望这是有帮助的!


    对我来说,最简单的方法是:

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(new Date());
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    
    //Here you say to java the initial timezone. This is the secret
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    //Will print in UTC
    System.out.println(sdf.format(calendar.getTime()));    
    
    //Here you set to your timezone
    sdf.setTimeZone(TimeZone.getDefault());
    //Will print on your default Timezone
    System.out.println(sdf.format(calendar.getTime()));
    

    与往常一样,我建议阅读这篇关于Java日期和时间的文章,以便你理解它。

    基本的想法是,'发动机罩'下的所有事情都是以自世纪以来的UTC毫秒来完成的。 这意味着,如果您完全不使用时区进行操作,则最简单,除了用户的字符串格式设置外。

    因此,我会跳过你建议的大部分步骤。

  • 在对象上设置时间(日期,日历等)。
  • 在格式化程序对象上设置时区。
  • 从格式化程序返回一个字符串。
  • 或者,您可以使用乔达时间。 我听说它是​​一个更直观的日期时间API。

    链接地址: http://www.djcxy.com/p/3109.html

    上一篇: Convert Date/Time for given Timezone

    下一篇: UTC Date/Time String to Timezone