在我的项目中,我得到了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);
假设aDate包含Jul 16, 2013 12:08:59 AM
答案 0 :(得分:61)
这是我的尝试:
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);
还要注意am / pm标记的“a”......
答案 1 :(得分:7)
我想提供现代答案。虽然SimpleDateFormat
是我们在2013年解析和格式化日期时间的类(除了Joda-Time),但它现在已经过时了,我们在java.time
或JSR-310中有了更好的表现,2014年Java 8推出的现代Java日期和时间API。
但是我听说你说大多数Android设备仍然没有运行Java 8。幸运的是,您仍然可以通过ThreeTenABP使用现代Java日期和时间API,这是JSR-310到Android Java 7的后端。详细信息位于this question: How to use ThreeTenABP in Android Project。
现在代码是:
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
进一步的观点:
h
。大写H
表示从0到23的小时。SimpleDateFormat
还是DateTimeFormatter
)。如果没有给出语言环境,格式化程序将使用设备的默认语言环境。 “Jul”和“AM”是英文的,你的代码可以很好地运行在许多设备上,直到有一天它运行在具有非英语语言环境和崩溃的设备上,你很难搞清楚原因。ZoneId.of("Asia/Kolkata")
。 JVM的默认时区可能会被程序的其他部分或在同一JVM中运行的其他程序更改,因此不可靠。答案 2 :(得分:3)
//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);
答案 3 :(得分:1)
使用以下代码。
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);
这应该有用。
答案 4 :(得分:1)
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; }
答案 5 :(得分:1)
这就是我在 android Build.VERSION.SDK_INT < 26
上的做法int offset = TimeZone.getDefault().getRawOffset();
String str_date='20:30 12-01-2021';
DateFormat formatter = new SimpleDateFormat("HH:mm dd-MM-yyy",Locale.US);
Date date = formatter.parse(str_date);
long utcTime = date.getTime() + (3600000*3);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm dd/MM/yyyy", Locale.US);
String dateStr = sdf.format(utcTime + offset);
System.out.println(dateStr);
当我的服务器发送带有 -3 时区的时间时,我必须将 (3600*3) 添加到 getTime 并将其保存到 utcTime 中,这样 utcTime 就是 UTC。然后我将手机当前时区的偏移量添加到 utcTime。 在我的情况下,因为我的时区是 -3 它的打印:
20:30 12/01/2021
但如果我更改时区,日期也会更改。