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

新手上路,请多包涵

我想将此 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. 返回具有新时区时间的字符串。 (格式化程序.格式(日历.getTime()))

原文由 travega 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 331
2 个回答

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

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

原文由 Charleston 发布,翻译遵循 CC BY-SA 4.0 许可协议

了解计算机时间的工作原理非常重要。话虽如此,我同意如果创建一个 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());

我希望这是有帮助的!

原文由 user726478 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题