为给定时区转换日期/时间 - java

2022-08-31 11:29:21

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

2011-10-06 03:35:05

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

此代码执行我当前时间所需的操作:

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));

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

是否可以:

  1. 设置对象上的时间(日历/日期/时间戳)
  2. (可能)设置初始时间戳的时区 (calendar.setTimeZone(...))
  3. 使用新的时区设置时间戳的格式 (formatter.setTimeZone(...)))
  4. 返回具有新时区时间的字符串。(formatter.format(calendar.getTime()))

答案 1

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

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

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()));

答案 2

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

反正我离题了!!如果您有UTC偏移量(在UTC中比GMT偏移量更好),则可以以毫秒为单位计算时间,并将其添加到时间戳中。请注意,SQL 时间戳可能与 Java 时间戳不同,因为从纪元开始的经过时间的计算方式并不总是相同的 - 取决于数据库技术和操作系统。

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

要计算偏移量,可以尝试如下方法:

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());

我希望这是有帮助的!