【发布时间】:2018-09-27 16:48:27
【问题描述】:
我在将 UTC 日期字符串转换为 Android 中的本地日期字符串时遇到问题。万一的例子是,
我已将 UTC 日期字符串输入为 2018-02-28T02:42:41Z
我在 PST 时区,但是当我尝试转换为本地时区时,它并没有改变。我得到February 28, 2018 02:42 AM 这是不正确的。
public static String convertUTCtoLocalTime(String utcDateString) throws Exception{
SimpleDateFormat dateFormatter;
//create a new Date object using the UTC timezone
Log.v(TAG, "Input utc date:" + utcDateString);
dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date utcDate = dateFormatter.parse(utcDateString);
//Convert the UTC date to Local timezone
dateFormatter = new SimpleDateFormat("MMMM dd, yyyy hh:mm a");
dateFormatter.setTimeZone(TimeZone.getDefault());
String formattedDate = dateFormatter.format(utcDate);
Log.v(TAG, "convertUTCtoLocalTime: local time:" + formattedDate);
return lv_dateFormateInLocalTimeZone;
}
我不完全理解其中的区别,但类似的转换在“swift”中起作用,如下所示,
static func utcDateToLocal(utcdate: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" //Input Format 2018-02-28T02:42:41Z
dateFormatter.timeZone = NSTimeZone(name: "UTC")! as TimeZone
let UTCDate = dateFormatter.date(from: utcdate)
dateFormatter.dateFormat = "MMMM dd, yyyy hh:mm a" // Output Format
dateFormatter.timeZone = TimeZone.current
let UTCToCurrentFormat = dateFormatter.string(from: UTCDate!)
return UTCToCurrentFormat
}
Swift 示例给出了“2018 年 2 月 27 日 06:42 PM”,这是正确的。
Swift 正在使用 v3.x 和
Android 是 Studio 3.1.1 构建 #AI-173.4697961,构建于 2018 年 4 月 3 日 JRE:1.8.0_152-release-1024-b01 x86_64 JVM:JetBrains s.r.o 的 OpenJDK 64 位服务器 VM Mac OS X 10.13.4
我在同一台机器上运行这两个示例。 任何解决 Android 问题的提示都会非常有用。
【问题讨论】:
-
我不知道为什么(这就是我不写答案的原因),但在这种情况下,
getDefault()返回的是 UTC 时区而不是 PST。如果您将getDefault()切换为getTimeZone("PST"),它会返回正确的值。 -
顺便考虑扔掉长期过时且臭名昭著的麻烦
SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。 -
您的转换是正确的。在我的电脑上,它通过
convertUTCtoLocalTime: local time:February 27, 2018 06:42 PM到Log.v()。你的问题是你的方法返回了一个你在方法中没有接触过的变量的值,lv_dateFormateInLocalTimeZone,所以它不可能保存转换后的值。另一件事,你确定TimeZone.getDefault()返回 PST 吗? (而不是菲律宾标准时间??至少三个时区称为 PST。) -
lv_dateFormateInLocalTimeZone 变量未使用。如果我设置,
TimeZone tz =TimeZone.getTimeZone("America/Los_Angeles"); dateFormatter.setTimeZone(tz);这将打印正确的本地日期字符串。我的应用程序在TimeZone.getDefault();?以外的移动设备上运行时如何获得正确的时区@
标签: java android timezone utc datetime-conversion