有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将UTC时间转换为本地时区

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

所以现在使用这两个参数,我必须得到字符串格式的日期时间。我在尝试将日期转换为字符串时遇到了这个问题,因为SimpleDataFormat。格式(…)将使用默认时区转换日期

下面是代码部分

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) 个答案

  1. # 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" ) )
    

    细节

    {a1}已关闭。我将提供进一步的资料

    你的问题不是很清楚输入的内容。我假设您的长整数代表UTC中的一个时刻

    {a2}是{a3}之前或之后的小时数、分钟数和秒数。在java中。时间,我们用^{}来表示

    虽然^{}在技术上是可行的(正如丹尼斯在代码中看到的),但这是误导性的,因为分区远不止是一个偏移量。分区是一个区域在不同历史时期生效的各种偏移的历史。分区还包括任何计划的未来变更,如未来几个月的DST切换

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

    提示:始终在小时数中添加空格零。虽然在各种协议(如ISO8601)中并不总是需要,但我看到软件系统在遇到像+5:00这样的单位小时数时会打嗝

    如果你确实知道预定的时区,就使用它。一个区域总比一个简单的偏移要好,因为它带来了过去、现在和未来其他偏移的所有历史信息

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

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

    我猜你的数字是自1970-01-01T00:00:00Z纪元以来的毫秒数

    Instant instant = Instant.ofEpochMilli( 1_490_112_300_000L );
    

    {a10}类表示{a3}中时间轴上的一个时刻,分辨率为{a12}(小数点最多九(9)位)

    你可以调整到一个时区

    ZonedDateTime zdt = instant.atZone( z );
    

    这些问题在堆栈溢出中已经讨论过多次。因此,你正在收集反对票(我猜)。请在发布前彻底搜索堆栈溢出


    关于java。时间

    java.time框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如^{}^{}、&^{}

    现在位于maintenance modeJoda-Time项目建议迁移到java.time

    要了解更多信息,请参阅Oracle Tutorial。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310

    在哪里可以获得java。时间课

    ThreeTen-Extra项目扩展了java。额外上课的时间。这个项目是将来可能添加到java的一个试验场。时间您可以在这里找到一些有用的类,例如^{}^{}^{}more

  2. # 2 楼答案

    使用Java8您可以

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

    使用此构造函数

    SimpleDateFormat(String pattern, Locale locale)
    

    Constructs a SimpleDateFormat using the given pattern and the default date format symbols for the given locale. Note: This constructor may not support all locales. For full coverage, use the factory methods in the DateFormat class.

    Java Doc