java utc时间转换为本地时间_java-在Android上将UTC转换为本地时间

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值