使用 joda time 将一个时区转换为另一个时区

Posted

技术标签:

【中文标题】使用 joda time 将一个时区转换为另一个时区【英文标题】:convert one time zone to another using joda time 【发布时间】:2014-02-11 01:14:59 【问题描述】:

有一个表格有一个国家下拉菜单,用户将选择国家,然后有一个时区下拉菜单,用户将选择用户选择的国家可用的时区。然后用户将输入本地日期(例如:2014 年 12 月 26 日)和时间(23:11)(24 小时制) 输入的日期和时间适用于所选国家和时区。 现在我必须将此日期和时间转换为 GMT 时区。我如何使用 joda time 来做到这一点

夏令时(DST)将如何计算?

我做了一个函数,它接受从时区到时区,日期的参数

public static String convertTimeZones( String fromTimeZoneString, 
             String toTimeZoneString, String fromDateTime) 
         DateTimeZone fromTimeZone = DateTimeZone.forID(fromTimeZoneString);
         DateTimeZone toTimeZone = DateTimeZone.forID(toTimeZoneString);
         DateTime dateTime = new DateTime(fromDateTime, fromTimeZone);

         DateTimeFormatter outputFormatter 
            = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm").withZone(toTimeZone);
        return outputFormatter.print(dateTime);
    

我想以某种格式(2014 年 2 月 24 日 12:34)将日期传递给这个函数,但它没有采用这种格式

【问题讨论】:

看this answer。 在这个链接中我什么都不懂,根据我的要求,我还必须通过用户选择的国家时区 Parsing date with Joda API的可能重复 【参考方案1】:
//so we can get the local date
//UTC = true, translate from UTC time to local
//UTC = false, translate from local to UTC

public static String formatUTCToLocalAndBackTime(String datetime, boolean UTC)  
    String returnTimeDate = "";
    DateTime dtUTC = null;
    DateTimeZone timezone = DateTimeZone.getDefault();
    DateTimeFormatter formatDT = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    DateTime dateDateTime1 = formatDT.parseDateTime(datetime);
    DateTime now = new DateTime();
    DateTime nowUTC = new LocalDateTime(now).toDateTime(DateTimeZone.UTC);
    long instant = now.getMillis();
    long instantUTC = nowUTC.getMillis();
    long offset = instantUTC - instant;

    if (UTC)  
        //convert to local time
        dtUTC = dateDateTime1.withZoneRetainFields(DateTimeZone.UTC);
        //dtUTC = dateDateTime1.toDateTime(timezone);
        dtUTC = dtUTC.plusMillis((int) offset);
     else  
        //convert to UTC time
        dtUTC = dateDateTime1.withZoneRetainFields(timezone);
        dtUTC = dtUTC.minusMillis((int) offset);        
    

    returnTimeDate = dtUTC.toString(formatDT);



    return returnTimeDate;

【讨论】:

【参考方案2】:

Java time api 在不同时区方面比 joda time api 更好,特别是在夏令时

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;

   LocalDateTime start = LocalDateTime.of(2021, 02, 25, 14, 25, 00);
   ZoneId zone = ZoneId.of("Asia/Singapore");
   start = start.atZone(zone).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();

【讨论】:

以上是关于使用 joda time 将一个时区转换为另一个时区的主要内容,如果未能解决你的问题,请参考以下文章

为什么org.joda.time.LocalDate是没有时区的日期?

Joda-Time,夏令时计算,时区独立测试

Python:如何将日期时间/时间戳从一个时区转换为另一个时区?

如何从 org.joda.time.DateTime 转换为 java.time.ZonedDateTime

如何使用 Joda Time 解析包含时区的日期

使用 Jackson 进行 DateTime 反序列化的默认时区(Joda-Time 模块)