在我的项目中,我得到了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
dev*_*ole 79
这是我的尝试:
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"...
我想提出现代的答案.虽然SimpleDateFormat是2013年我们用于解析和格式化日期时间的类(除了Joda-Time),但它现在已经过时了,而且我们在java.timeJSR-310或现代Java日期和时间API 方面做得更好了.2014年推出Java 8.
但我听说大多数Android设备仍然没有运行Java 8.幸运的是,您仍然可以通过ThreeTenABP(JSR-310到Android Java 7的后端)使用现代Java日期和时间API.详细信息如下:如何在Android项目中使用ThreeTenABP.
现在的代码是:
    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中运行的其他程序更改,因此不可靠.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; }
//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);