我必须将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;
}
如果我们可以使用偏移来实现这个目标,请告诉我吗?
答案 0 :(得分:1)
使用此构造函数
SimpleDateFormat(String pattern, Locale locale)
使用给定的模式和默认值构造SimpleDateFormat 给定语言环境的日期格式符号。注意:这个构造函数可能 不支持所有语言环境。要获得完整的覆盖率,请使用工厂方法 DateFormat类。
答案 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)
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-UTC是UTC之前或之后的小时数,分钟数和秒数。在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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。