java-在Android上将UTC转换为本地时间
在我的项目中,我获得了json格式的API响应。 我得到UTC时间格式的时间的字符串值,例如Jul 16, 2013 12:08:59 AM。
我需要将其更改为本地时间。那就是我们使用此应用程序需要显示当地时间的地方。 我该怎么做?
这是我尝试过的一些代码:
String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getDefault());
String formattedDate = simpleDateFormat.format(aDate);
假设日期包含Jul 16, 2013 12:08:59 AM
MadTech asked 2020-08-11T19:29:38Z
5个解决方案
75 votes
这是我的尝试:
String dateStr = "Jul 16, 2013 12:08:59 AM";
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(date);
还要注意上午/下午标记的“ a” ...
devconsole answered 2020-08-11T19:29:48Z
8 votes
我想贡献现代的答案。 虽然ZoneId.of("Asia/Kolkata")是我们在2013年用于解析和格式化日期时间的类(除了Joda-Time),但它现在已经过时了,我们在DateTimeFormatter或JSR-310(现代Java日期和时间API)方面有很多改进 在2014年随Java 8一起推出。
但是我听到您说过,大多数Android设备仍未运行Java 8。 幸运的是,您仍然可以通过ThreeTenABP(JSR-310向Android Java 7的反向端口)通过ThreeTenABP在其上使用现代Java日期和时间API。
现在的代码是:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm:ss a", Locale.ENGLISH);
String aDate = "Jul 16, 2013 12:08:59 AM";
String formattedDate = LocalDateTime.parse(aDate, formatter)
.atOffset(ZoneOffset.UTC)
.atZoneSameInstant(ZoneId.systemDefault())
.format(formatter);
System.out.println(formattedDate);
由于我的计算机运行的是欧洲/哥本哈根时区,该时区在7月比UTC早2小时,因此打印
Jul 16, 2013 02:08:59 AM
其他要点:
由于您的字符串中包含AM,因此我假设您的小时数在1到12的AM范围内。要正确解析和格式化它们,您需要在格式模式字符串中使用小写ZoneId.of("Asia/Kolkata")。 大写字母DateTimeFormatter是一天中的0到23。
最好为格式化程序提供清晰的语言环境(无论是ZoneId.of("Asia/Kolkata")还是DateTimeFormatter)。 如果未提供语言环境,则格式化程序将使用设备的默认语言环境。 “ Jul”和“ AM”是英语,并且您的代码可能在许多设备上都能很好地运行,直到有一天它在具有非英语语言环境且崩溃的设备上运行,并且您很难找出原因。
如果可以,请明确指定所需的时区,例如ZoneId.of("Asia/Kolkata")。JVM的默认时区可能会被程序的其他部分或运行在同一JVM中的其他程序更改,因此并不可靠。
Ole V.V. answered 2020-08-11T19:30:41Z
3 votes
//your UTC time var
long time = UTCtime;
//convert it
Time timeFormat = new Time();
timeFormat.set(time+TimeZone.getDefault().getOffset(time));
//use the value
long localTime = timeFormat.toMillis(true);
Tom Brinkkemper answered 2020-08-11T19:30:57Z
3 votes
1.本地到UTC转换器
public static String localToUTC(String dateFormat, String datesToConvert) {
String dateToReturn = datesToConvert;
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
sdf.setTimeZone(TimeZone.getDefault());
Date gmt = null;
SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFormat);
sdfOutPutToSend.setTimeZone(TimeZone.getTimeZone("UTC"));
try {
gmt = sdf.parse(datesToConvert);
dateToReturn = sdfOutPutToSend.format(gmt);
} catch (ParseException e) {
e.printStackTrace();
}
return dateToReturn;
}
2. UTC到本地转换器
public static String uTCToLocal(String dateFormatInPut, String dateFomratOutPut, String datesToConvert) {
String dateToReturn = datesToConvert;
SimpleDateFormat sdf = new SimpleDateFormat(dateFormatInPut);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date gmt = null;
SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFomratOutPut);
sdfOutPutToSend.setTimeZone(TimeZone.getDefault());
try {
gmt = sdf.parse(datesToConvert);
dateToReturn = sdfOutPutToSend.format(gmt);
} catch (ParseException e) {
e.printStackTrace();
}
return dateToReturn; }
Ronak Gadhia answered 2020-08-11T19:31:21Z
2 votes
使用以下代码。
TimeZone defaultTimeZone = TimeZone.getDefault();
String strDefaultTimeZone = defaultTimeZone.getDisplayName(false, TimeZone.SHORT);
//Your Code
String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone(strDefaultTimeZone));
String formattedDate = simpleDateFormat.format(aDate);
这应该工作。
Salman Khakwani answered 2020-08-11T19:31:45Z