将UTC时间转换为本地时区

时间:2017-03-28 17:39:08

标签: java

我必须将UTC时间转换为用户本地时区。目前,我有两个参数,一个是长格式的时间,另一个是字符串格式的时区名称,如"(UTC-05:00)东部时间(美国和加拿大),(UTC-06:00)中央时间(美国和加拿大)"等

所以现在使用这两个参数我必须以字符串格式获取日期时间。我正在尝试将日期转换为字符串时遇到问题,因为SimpleDateFormat.format(...)将使用其默认时区转换日期。

以下是代码部分

public static void main(String[] args) 
{
long time = 1490112300000L;
System.out.println("UTC Time "+ convertLongToStringUTC(time));

String EST = "(UTC-05:00) Eastern Time (US and Canada)";
TimeZone  timeZone1 = TimeZone.getTimeZone(EST);
System.out.println("EST "+ convertTimeZone(time, timeZone1));

String CST = "(UTC-06:00) Central Time (US and Canada)";
TimeZone timeZone2 = TimeZone.getTimeZone(CST); 
System.out.println("CST "+ convertTimeZone(time, timeZone2));

String IST =  "IST";
TimeZone timeZone = TimeZone.getTimeZone(IST);      
System.out.println("IST "+ convertTimeZone(time, timeZone));    

}

public String convertTimeZone(long time, TimeZone timeZone)
{
Date date = new Date(time);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format.setTimeZone(timeZone);
return format.format(date);
}   

public String convertLongToStringUTC(long time)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String utcTime = sdf.format(new Date(time));
return utcTime;
}

如果我们可以使用偏移来实现这个目标,请告诉我吗?

3 个答案:

答案 0 :(得分:1)

使用此构造函数

SimpleDateFormat(String pattern, Locale locale)
  

使用给定的模式和默认值构造SimpleDateFormat   给定语言环境的日期格式符号。注意:这个构造函数可能   不支持所有语言环境。要获得完整的覆盖率,请使用工厂方法   DateFormat类。

Java Doc

答案 1 :(得分:1)

使用 Java 8 ,您可以

OffsetDateTime dt = Instant.ofEpochMilli(System.currentTimeMillis())
                            .atOffset( ZoneOffset.of("-05:00"));
//In zone id you put the string of the offset you want

答案 2 :(得分:1)

TL;博士

Instant.ofEpochMilli( 1_490_112_300_000L )
       .atOffset( ZoneOffset.of( "-05:00" ) )

Instant.ofEpochMilli( 1_490_112_300_000L )
       .atZone( ZoneId.of( "America/New_York" ) )

详细

Answer by Dennis已接近尾声。我会提供进一步的信息。

您的问题对输入并不十分清楚。我假设您的长整数代表UTC的一个时刻。

offset-from-UTCUTC之前或之后的小时数,分钟数和秒数。在java.time中,我们使用ZoneOffset来表示它。

虽然ZoneId在技术上有效(如Dennis的代码所示),但这会产生误导,因为区域不仅仅是偏移。区域是区域在不同历史时期生效的各种偏移的历史。区域还包括任何计划的未来变化,例如未来几个月内将发生的DST切换。

ZoneOffset offset = ZoneOffset.of( 5 , 30 ); // Five-and-a-half hours ahead of UTC.

ZoneOffset offset = ZoneOffset.of( "+05:30" );

提示:始终在小时内包含填充零。虽然在ISO 8601等各种协议中并不总是需要,但我遇到过遇到像+5:00这样的单位数小时的软件系统。

如果您知道确定的时区,请使用它。区域总是优于仅仅偏移,因为它带来了过去,现在和未来的其他偏移的所有历史信息。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Asia/Kolkata" );

我猜你的号码是1970-01-01T00:00:00Z时代以来的毫秒数。

Instant instant = Instant.ofEpochMilli( 1_490_112_300_000L );

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

您可以调整为时区。

ZonedDateTime zdt = instant.atZone( z );

Stack Overflow已多次涵盖这些问题。因此,你正在收集的投票(我猜)。请在发布前彻底搜索Stack Overflow。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore