从UTC到IST的转换使用Joda时间库在JAVA中返回相同的值



我需要将我的项目中的时区从UTC转换为IST,反之亦然。为此,我在我的项目中使用Joda time jar。但是当我尝试将字符串从UTC转换为IST时,问题发生了,我得到了相同的值,而不是得到转换后的IST值。请指导我在代码的哪一部分我完全卡住了。我的代码如下:

public class JodaDemo {
    public static final String DATE_PATTERN_SERVICE = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_PATTERN_SERVICE_NO_SECONDS = "yyyy-MM-dd HH:mm";
    public static void main(String[] args) {
        getDateFromUTCtoIST("2015-08-23 10:34:40");
    }
private static void getDateFromUTCtoIST(String dateTime) {
        DateTimeFormatter dtf = DateTimeFormat.forPattern(DATE_PATTERN_SERVICE);
        DateTime jodatime = dtf.parseDateTime(dateTime);
        DateTimeZone indianTimeZone = DateTimeZone.forID("Asia/Kolkata");
        DateTime indianTime = jodatime.withZone(indianTimeZone);
        System.out.println(indianTime);
    }
输出:

2015-08-23T10:34:40.000+05:30
预期输出:

转换时区(+5:30输出),如yyyy-MM-dd HH:mm:ss格式

这里有两个问题。首先,当您解析该值时,您没有指定时区—因此它使用您的本地时区。其次,您没有对结果使用任何格式化程序—您只是隐式地调用DateTime.toString()

最简单的方法实际上是为相同的模式创建两个格式化程序,一个在UTC,另一个在相关的时区-然后你根本不需要手动转换,因为格式化程序可以为你做:

import java.util.*;
import org.joda.time.*;
import org.joda.time.format.*;
public class Test {
  public static final String DATE_PATTERN_SERVICE = "yyyy-MM-dd HH:mm:ss";
    public static void main(String[] args) {        
        DateTimeFormatter utcFormatter = DateTimeFormat
            .forPattern(DATE_PATTERN_SERVICE)
            .withLocale(Locale.US)
            .withZoneUTC();
        DateTimeZone indianZone = DateTimeZone.forID("Asia/Kolkata");
        DateTimeFormatter indianZoneFormatter = utcFormatter.withZone(indianZone);
        String utcText = "2015-08-23 10:34:40";
        DateTime parsed = utcFormatter.parseDateTime(utcText);
        String indianText = indianZoneFormatter.print(parsed);
        System.out.println(indianText); // 2015-08-23 16:04:40
    }
}

java.time

下面引用的是来自Joda-Time:

主页的通知

注意,从Java SE 8开始,用户被要求迁移到Java。time (JSR-310)——JDK的核心部分,取代了这个项目。

使用java.time的解决方案,现代日期-时间API:

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
    public static void main(String[] args) {
        String strDateTime = "2015-08-23 10:34:40";
        
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss", Locale.ENGLISH);
        LocalDateTime ldt = LocalDateTime.parse(strDateTime, parser);
        
        ZonedDateTime zdtUtc = ldt.atZone(ZoneId.of("Etc/UTC"));
        ZonedDateTime zdtIndia = zdtUtc.withZoneSameInstant(ZoneId.of("Asia/Kolkata"));
        System.out.println(zdtIndia);
        OffsetDateTime odt = zdtIndia.toOffsetDateTime();
        System.out.println(odt);
    }
}
输出:

2015-08-23T16:04:40+05:30[Asia/Kolkata]
2015-08-23T16:04:40+05:30
<<p> 在线演示/kbd>

注意事项:

  1. 如果你要处理JDBC,检查这个答案和这个答案学习如何使用java.time API与JDBC。
  2. 无论出于何种原因,如果您需要将OffsetDateTime的对象转换为java.util.Date的对象,您可以这样做:
    Date date = Date.from(odt.toInstant());

Trail: Date Time了解更多关于现代日期时间API的信息。


*出于任何原因,如果你必须坚持Java 6或Java 7,你可以使用ThreeTen-Backport,它支持大部分 Java。time功能到Java 6 &7. 如果你正在为一个Android项目工作,你的Android API级别仍然不符合Java-8,检查Java 8+可用的API,通过desugaring和如何在Android项目中使用ThreeTenABP。

相关内容

  • 没有找到相关文章

最新更新