Android 将日期/时间解析为localtimezone

Android 将日期/时间解析为localtimezone,android,try-catch,date,Android,Try Catch,Date,我试图在bind viewholder中解析来自服务器端的日期/时间json。 试图解析的日期字符串am如下: 2018-06-25T08:06:52Z 下面是我正在使用的代码(从另一个堆栈溢出线程获得) 但是,这不起作用,为文本视图设置的时间与解析之前相同 设置到文本视图的时间与解析之前相同 这是因为您没有传入新的SimpleDataFormat 试试这个: final String serverDate = "2018-06-25T08:06:52Z" final SimpleDateFo

我试图在bind viewholder中解析来自服务器端的日期/时间json。 试图解析的日期字符串am如下:

2018-06-25T08:06:52Z
下面是我正在使用的代码(从另一个堆栈溢出线程获得)

但是,这不起作用,为文本视图设置的时间与解析之前相同

设置到文本视图的时间与解析之前相同

这是因为您没有传入新的
SimpleDataFormat

试试这个:

final String serverDate = "2018-06-25T08:06:52Z"
final SimpleDateFormat serverDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
final SimpleDateFormat yourDateFormat = new SimpleDateFormat("yyyy-MM-dd"); // put whatever you want here!

try {
    final Date date = serverDate.parse(serverDateFormat);
    final String formattedDate = yourDateFormat.format(date);
} catch (ParseException e) {
    System.out.println(e.toString());
}

这样,您就可以将服务器格式的
字符串
解释为一个纯
日期
对象。然后,您可以自由地对该对象执行您想要的操作,并将其转换为您想要的格式(通过提供新格式)

有关构建日期格式模式的详细信息,请参见

设置到文本视图的时间与解析之前相同

这是因为您没有传入新的
SimpleDataFormat

试试这个:

final String serverDate = "2018-06-25T08:06:52Z"
final SimpleDateFormat serverDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
final SimpleDateFormat yourDateFormat = new SimpleDateFormat("yyyy-MM-dd"); // put whatever you want here!

try {
    final Date date = serverDate.parse(serverDateFormat);
    final String formattedDate = yourDateFormat.format(date);
} catch (ParseException e) {
    System.out.println(e.toString());
}

这样,您就可以将服务器格式的
字符串
解释为一个纯
日期
对象。然后,您可以自由地对该对象执行您想要的操作,并将其转换为您想要的格式(通过提供新格式)

有关构建日期格式模式的详细信息,请参见

这张照片是:

内罗毕时间:11:06

我使用的是
java.time
,在本例中是Java6和Java7的后端口。这个后端口在Android版本中也可用,您可以将其用于较低的Android API级别。我的进口是:

import org.threeten.bp.Instant;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.temporal.ChronoUnit;
如果需要此格式的API的时间字符串,则可以。如果您正在为用户演示一个时间字符串,那么考虑使用java的内置格式代替:

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
    ZonedDateTime dateTime = inst.atZone(ZoneId.of("Africa/Nairobi"));
    System.out.println("Formatted: " + dateTime.format(timeFormatter));
我试着在斯瓦希里语(sw_KE)语言环境中运行此程序,得到:

格式:上午11:06

显然,这个地区使用英语AM/PM方式记录时间(我在Kikuyu和Kalenjin地区得到了相同的结果)。在英国地区,我得到了与以前相同的格式:

格式:11:06

我正在使用和建议
java.time
,这是一种现代的java日期和时间API。对于任何阅读和使用Java8或更高版本或为AndroidAPI级别26或更高版本编程的人,您不需要提到的backport。只需从
java.time
导入带有子包的内置日期时间类,而不是上面提到的那些

你的代码出了什么问题? 错误来自将日期时间字符串中的
Z
硬编码为文本。它的UTC偏移量为零,如果您不这样分析,则日期-时间字符串将在您的
SimpleDataFormat
、非洲/内罗毕的时区中进行分析,这对于您的字符串是不正确的

不过,我想您根本不应该使用
SimpleDateFormat
时区
日期
。这些类已经过时很久了,第一个类尤其麻烦。我总是使用
java.time

另一个提示:不要接受例外。不要将您的
catch
块留空。以某种明显的方式报告异常。这是您发现代码中出现错误的机会

链接
  • 解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻
这张照片是:

内罗毕时间:11:06

我使用的是
java.time
,在本例中是Java6和Java7的后端口。这个后端口在Android版本中也可用,您可以将其用于较低的Android API级别。我的进口是:

import org.threeten.bp.Instant;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.temporal.ChronoUnit;
如果需要此格式的API的时间字符串,则可以。如果您正在为用户演示一个时间字符串,那么考虑使用java的内置格式代替:

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
    ZonedDateTime dateTime = inst.atZone(ZoneId.of("Africa/Nairobi"));
    System.out.println("Formatted: " + dateTime.format(timeFormatter));
我试着在斯瓦希里语(sw_KE)语言环境中运行此程序,得到:

格式:上午11:06

显然,这个地区使用英语AM/PM方式记录时间(我在Kikuyu和Kalenjin地区得到了相同的结果)。在英国地区,我得到了与以前相同的格式:

格式:11:06

我正在使用和建议
java.time
,这是一种现代的java日期和时间API。对于任何阅读和使用Java8或更高版本或为AndroidAPI级别26或更高版本编程的人,您不需要提到的backport。只需从
java.time
导入带有子包的内置日期时间类,而不是上面提到的那些

你的代码出了什么问题? 错误来自将日期时间字符串中的
Z
硬编码为文本。它的UTC偏移量为零,如果您不这样分析,则日期-时间字符串将在您的
SimpleDataFormat
、非洲/内罗毕的时区中进行分析,这对于您的字符串是不正确的

不过,我想您根本不应该使用
SimpleDateFormat
时区
日期
。这些类已经过时很久了,第一个类尤其麻烦。我总是使用
java.time

另一个提示:不要接受例外。不要将您的
catch
块留空。以某种明显的方式报告异常。这是您发现代码中出现错误的机会

链接
  • 解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

在API级别26中,您可以使用
java.time.Instant
和相关类。为了填补以前的评论所说的阿诺尔达斯的评论,考虑扔掉。