将字符串中的时区转换为特定时区,将夏令时考虑到目标时区



我正在尝试将格式为"yyyyMMddHHmmss"的日期字符串转换为另一个时区"America/Sao_Paulo"的日期串,同时考虑到美国/圣保罗的夏令时(从2016年10月16日开始)。

我使用时区类作为

TimeZone表示时区偏移,还计算日光节省物

import java.util.TimeZone;
import java.text.*;
import java.util.Date;;
public class TimeZoneConversion {
    public static void main(String[] args) 
    {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");     
            sdf.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
            try
            {   
                String inputdate = "20161016052355";
                Date t = sdf.parse(inputdate);  
                System.out.println(t);
            }
            catch(ParseException e)
            {
            }    
    }
}

以上输出显示在IST 中

Sun Oct 16 12:53:55 IST 2016

如何将输入为"yyyyMMddHHmmss"的时间字符串转换为输出为夏令时的"America/Sao_Paulo"时区中的时间字符串?

您只需在当天不是夏令时的时区打印它-打印Date会在JVM的默认时区打印它。

例如,将System.out.println(t)替换为:

SimpleDateFormat out = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss zzzz");
out.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
System.out.println(out.format(t));

打印:

2016/10/16 05:23:55 Brasilia Summer Time

Ideone演示

java.time

您正在使用麻烦的旧日期时间类,现在已被java.time类取代。

您的输入与UTC或时区信息没有任何偏移。因此,我们解析为LocalDateTime,意思是任何位置。

String input = "20161016052355";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMddHHmmss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f );

ldt.toString():2016-10-16T05:23:55

LocalDateTime而不是时刻,不是timeline上的点。要赋予它真正的意义,您必须提供预期的时区(或偏移量)。

ZoneId z = ZoneId.of( "America/Sao_Paulo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

zdt.toString():2016-10-16T05:23:55-02:00[美国/圣保罗]

要查看与UTC相同的时刻,请提取一个Instant

Instant instant = zdt.toInstant() ;

instant.toString():2016-10-16T07:23:55Z

请在IdeOne.com上实时查看此代码。


关于java.time

java.time框架是在java 8及更高版本中构建的。这些类取代了诸如java.util.DateCalendar和&SimpleDateFormat

JodaTime项目现在处于维护模式,建议迁移到java.Time类。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。

从哪里获得java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置
    • 标准Java API的一部分,带有捆绑实现
    • Java 9添加了一些小功能和修复程序
  • Java SE 6Java SE 7
    • 大部分java.time功能都是向后移植到Java6&7英寸ThreeTen背包
  • 安卓
    • ThreeTenABP项目专门为安卓系统改编了ThreeTen Backport(如上所述)
    • 请参阅如何使用ThreeTenABP…

ThreeTen Extra项目通过附加类扩展java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。

请检查。。。

请更换您的特定时区

string dts="2010年5月16日上午7:20:12 CDT";日期时间dt=DateTime.ParseExact(dts.Replace("CDT","-05:00"),"yyyyMMddHHmmss",null);

这对我有效

try
{
SimpleDateFormat f = new SimpleDateFormat("yyyyMMddhhmmss");
f.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
Date time = f.parse("20161015113634");  

DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");  
formatter.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
System.out.println(formatter.format(time)); 
}
catch (ParseException e){
    
} 

输入:20161015113634(不在夏令时的时间)

输出:20161015030634(SaoPaulo的转换时间)

输入:20161016113634(夏令时时间)

输出:20161016040634(带夏令时偏移的SaoPaulo转换时间)

最新更新