0

最终目标是将从服务器传递下来的时间戳转换为本地时间。

这是我得到的:

2018-04-05T16:14:19.130Z

但是,我的当地时间是11:14 AM CST. 这是我尝试过的:

 final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
 final LocalTime localTime = formatter.parseLocalTime(text);
 Timber.i(localTime.toString()); // output: 16:14:19.070

输出是:16:14:19.070。有人知道如何使用它吗?我希望收到类似的东西11:14 AM

另外,我试过使用这个:

 final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
 final DateTime time = formatter.parseDateTime(text);
 Timber.i(time.toString());  // output: 2018-04-05T16:14:19.490-05:00

好像有5小时的时差?有人知道我如何使用它来转换为当地时间吗?

4

2 回答 2

3

最后的“Z”表示日期/时间为 UTC。如果你把它放在引号内,它会被视为文字(字母“Z”本身)并且它失去了这个特殊含义——你基本上是在丢弃它在 UTC 中的信息,并DateTime假设 JVM 默认时区(这就是为什么你的第二次尝试导致 UTC-05:00 为 16:14)。

DateTime可以直接解析这个输入:

String input = "2018-04-05T16:14:19.130Z";
DateTime dt = DateTime.parse(input);

然后将其转换为所需的时区。你可以做:

dt = dt.withZone(DateTimeZone.getDefault());

这将使用您的 JVM 的默认时区。但这并不那么可靠,因为默认值可以在运行时更改——即使是在同一个 JVM 中运行的其他应用程序——所以最好使用显式时区:

dt = dt.withZone(DateTimeZone.forID("America/Chicago"));

然后您可以将其转换为您想要的格式:

String time = dt.toString("hh:mm a"); // 11:14 AM

如果您需要使用格式化程序,您可以删除“Z”周围的引号并在格式化程序中设置时区:

DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    // zone to be used for the formatter
    .withZone(DateTimeZone.forID("America/Chicago"));
DateTime dateTime = parser.parseDateTime("2018-04-05T16:14:19.130Z");
String time = dateTime.toString("hh:mm a"); // 11:14 AM
于 2018-04-05T17:05:40.680 回答
0

使用此方法将您的时间转换为本地时间:

 public static String convertTimeToLocal(String dateStr) {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;

        try {
            date = format.parse(dateStr);
            System.out.println(date);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        String timeZone = Calendar.getInstance().getTimeZone().getID();
        Date local = new Date(date.getTime() + TimeZone.getTimeZone(timeZone).getOffset(date.getTime()));
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
        String reportDate = df.format(local);

        return reportDate;
    }

& 对于上午和下午,请使用以下方法:

public static String convertTimeToAmPm(String time) {
        List<String> arr = Arrays.asList(time.split(":"));
        int hours = Integer.parseInt(arr.get(0));
        int mins = Integer.parseInt(arr.get(1));

        String timeSet = "";
        if (hours > 12) {
            hours -= 12;
            timeSet = "PM";
        } else if (hours == 0) {
            hours += 12;
            timeSet = "AM";
        } else if (hours == 12)
            timeSet = "PM";
        else
            timeSet = "AM";

        String minutes = "";
        if (mins < 10)
            minutes = "0" + mins;
        else
            minutes = String.valueOf(mins);
        // Append in a StringBuilder
        String aTime = new StringBuilder().append(hours).append(':')
                .append(minutes).append(" ").append(timeSet).toString();
        return aTime;
    }
于 2018-04-05T16:38:58.633 回答