我需要将我的项目中的时区从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> 注意事项:
- 如果你要处理JDBC,检查这个答案和这个答案学习如何使用
java.time
API与JDBC。 - 无论出于何种原因,如果您需要将
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。