Java 日历对象时区转换

Java 日历对象时区转换,java,calendar,timezone,Java,Calendar,Timezone,我有一个日历对象,它位于UTC时区。我想将日历对象中的日期和时间转换为PST,同时记住所有DST。我希望编写一个具有以下签名的助手函数: private Calendar getpstime(日历utcTime) { } 仅供参考:该方法返回所有可用的时区字符串标识符。这就是我从中获得“America/Los_Angeles”的原因。Java中的时间事件存储为该事件与1970年1月1日00:00:00 GMT之间的毫秒数(例如,好像它发生在伦敦) 因此,每当我们在Java中谈论日期和时间时,如

我有一个日历对象,它位于UTC时区。我想将日历对象中的日期和时间转换为PST,同时记住所有DST。我希望编写一个具有以下签名的助手函数:

private Calendar getpstime(日历utcTime)
{
}

仅供参考:该方法返回所有可用的时区字符串标识符。这就是我从中获得“America/Los_Angeles”的原因。

Java中的时间事件存储为该事件与1970年1月1日00:00:00 GMT之间的毫秒数(例如,好像它发生在伦敦)

因此,每当我们在Java中谈论日期和时间时,如Java.util.date或Java.util.Calendar所示,我们总是谈论绝对数,而不管时区如何

只有当我们试图将日期/时间输出为字符串时,时区才有意义。在我的脑海中,我能想起两种方法:

  • 使用日历,设置时区,使用get(Calendar.XXX)方法获取所需时区中的各个日期/时间组件
  • 使用SimpleDateTimeFormat,设置时区,将整个日期/时间格式化为所需时区的单个字符串
Java中确实没有“时区转换”之类的东西,但是有特定于时区的格式

但是,如果您想让事情变得非常混乱,可以将“更正”添加到日历时间值中,这样它将返回字段值,就像它在PST时区一样:

private Calendar getPSTTime(Calendar utcTime)
{
   TimeZone pstZ = TimeZone.getTimeZone("America/Los_Angeles");
   long offset = pstZ.getOffset(utcTime.getTime());
   Calendar pacificTime = Calendar.getInstance();
   pacificTime.setTimeInMillis(utcTime.getTimeInMillis()-offset); 
   return pacificTime;
}

没有必要在标题中说“Java编程语言”;您已经为它添加了一个标记,标记系统在这里工作得非常好,没有任何帮助。主题中不需要使用标签提供的任何信息,您可以使用空格来更好地描述您的问题。(你通常也应该问一个问题,而不是仅仅陈述一个目标,并展示你自己在实际解决问题上所做的一些努力。)还有一个傻瓜,还有一些其他的。在发布问题之前,请至少在此处进行基本搜索,以查看是否已被询问和回答。我链接的部分内容在右侧的“相关”列表中。谢谢。我确实在找现有的帖子。这对我没有帮助。我的问题很具体。另外,我不知道我能如何更好地描述这个函数。我已经给了方法签名。编写过java代码的人应该理解我要实现的目标。这是我尝试的第一件事。这样做只会设置UTC时间。它不会将时间转换为PST。谢谢。@user2055876请尝试时区。获取时区(“PST”)。还有,你是如何检查这个方法不起作用的(它对我来说很好)?常见的错误是,人们通过打印
calendar.getTime()
来检查它,它根据存储在日历中的毫秒返回
新日期(毫秒)
,而忘记了
Date
使用默认区域设置。要检查日历转换是否正确,请直接从中获取值,如
calendar.get(calendar.HOUR\u OF_DAY)
private Calendar getPSTTime(Calendar utcTime)
{
   TimeZone pstZ = TimeZone.getTimeZone("America/Los_Angeles");
   long offset = pstZ.getOffset(utcTime.getTime());
   Calendar pacificTime = Calendar.getInstance();
   pacificTime.setTimeInMillis(utcTime.getTimeInMillis()-offset); 
   return pacificTime;
}