java 转换时间从BST到美国时区CST MST EST PST

3pvhb19x  于 2023-03-28  发布在  Java
关注(0)|答案(3)|浏览(256)

我把时间从格林尼治标准时间转换到不同的美国时区。为此,我写了一个方法,返回1小时前的时间。如果时间是2:00,它返回1:00

private static Date timeFormat(String timeZone) throws ParseException {
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    DateFormat gmtFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    gmtFormat.setTimeZone(TimeZone.getTimeZone(TimeZone.getDefault().getID()));
    Date date = null;
    try {
        date = gmtFormat.parse(sdfDate.format(new Date()));
        LOG.info("GMT format time and date ==>> "+date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    pstFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
    String timedd = pstFormat.format(date);
    LOG.info("Return the new time based on timezone : "+pstFormat.format(date));
    return gmtFormat.parse(timedd);
}

谁能告诉我到底是什么问题,因为几个月前同样的方法工作得很好?是因为夏令时吗?

bxjv4tth

bxjv4tth1#

使用java.time API可以以一种更简单的方式完成这一点。使用Instant以UTC表示时间。它可以转换为任何区域的时间,并格式化为特定模式。

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
Instant now = Instant.now();
ZonedDateTime dt = now.atZone(ZoneId.of("UTC-05:00"));
System.out.println(dt.format(format)); //2017-05-24 04:51:03
ZonedDateTime pstDate = now.atZone(ZoneId.of("UTC-07:00"));
System.out.println(pstDate.format(format)); //2017-05-24 02:51:03
6pp0gazn

6pp0gazn2#

经过这么多的挖掘,我发现时区不会根据时区给予正确的结果
(EST、CST、MST、PST)
所以在我的方法中,我作为timeZone传递的参数是作为
(EST、CST、MST、PST)
我传递了US/EasternUS/PacificUS/MountainUS/Central,而不是EST, CST, MST, PST,它对我来说工作得很好

sqxo8psd

sqxo8psd3#

java.time

使用现代的 java.time 类,而不是有严重缺陷的遗留类。
new Date());
否,使用Instant类捕获当前时刻。此类表示从UTC偏移0小时-分钟-秒的时刻。

Instant instant = Instant.now() ;

从GMT
在大多数业务应用程序中,GMT等同于UTC。
科学和工程是有区别的,这与我们大多数人无关。
到不同的美国时区
美国及其领土上有许多时区。
真实的时区的名称格式为Continent/Region,例如America/ChicagoAmerica/JuneauAmerica/Kentucky/LouisvilleAmerica/Los_AngelesPacific/Guam
所以你需要说得更具体些。

List < ZoneId > zoneIds =
    List.of(
        ZoneId.of( "America/Juneau" ) ,
        ZoneId.of( "America/Los_Angeles" ) ,
        ZoneId.of( "America/Chicago" ) ,
        ZoneId.of( "America/New_York" ) 
    )
;
for ( ZoneId zoneId : zoneIds ) 
{
    ZonedDateTime zdt = instant.atZone( zoneId ) ;
    String output = zdt.toString() ;  // Standard ISO 8601 format, wisely extended by appending the name of the time zone in square brackets.
    System.out.println( output ) ;
}

代码run at Ideone.com

2023-03-27T04:23:55.441822Z
2023-03-26T20:23:55.441822-08:00[America/Juneau]
2023-03-26T21:23:55.441822-07:00[America/Los_Angeles]
2023-03-26T23:23:55.441822-05:00[America/Chicago]
2023-03-27T00:23:55.441822-04:00[America/New_York]

您评论:
CST和PST,但EST和MST的时间不同
这种2-4个字符的伪时区不是真实的的时区名称。它们不是标准化的。它们不是唯一的。请使用上面看到的真正时区名称。

相关问题