将人类日期(当地时间GMT)转​​换为日期

时间:2018-06-22 06:56:53

标签: java android date parsing

我正在服务器上工作,并且服务器正在使用字符串格式的Fri Jun 22 09:29:29 NPT 2018将GMT本地日期发送给我,并将其转换为日期,如下所示:

SimpleDateFormat simpleDateFormat=new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy",Locale.English);
Date newDate=simpleDateFormat.parse("Fri Jun 22 09:29:29 NPT 2018");
TimeAgo ta=new TimeAgo();
Log.d(TAG,""+ta.timeAgo(newDate));

我需要像5 hours ago那样花些时间在前,因为我使用的是github project on which returns TimeAgo on passing date

我已经看过this answer,但没有解决我的问题。

  

异常:Err java.text.ParseException:不可解析的日期:“ Fri Jun 22 09:29:29 NPT 2018”(偏移量为20)            错误java.text.ParseException:无法解析的日期:“ NPT 2018年6月22日星期五09:29:29”(偏移量为20)

2 个答案:

答案 0 :(得分:2)

Date类主要已被弃用,所以我建议不要使用它。

也许可以考虑使用ZonedDateTime类之类的东西来解决问题。

如果您只是在等待String发送5个小时后才可以使用,则可以使用以下方法:

String time = "Fri Jun 22 09:29:29 NPT 2018";
DateTimeFormatter format = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz uuuu");
ZonedDateTime zdt = ZonedDateTime.parse(time, format);
System.out.println(zdt.minusHours(5));

答案 1 :(得分:2)

NPT不被识别为时区缩写

问题是您的日期时间字符串(显然是Date.toString()的输出)的解析(不是随后使用TimeAgo的问题,您可以将其排除在问题之外以使其更清楚) )。不可分割的部分位于索引20,即NPT的位置,我指的是尼泊尔时间。因此,Android设备或仿真器上的SimpleDateFormat不会将NPT识别为时区缩写。

时区缩写是语言环境数据的一部分。我不是Android开发人员,也不知道Android从何处获取其区域设置数据。快速网络搜索提到了ICU和CLDR。您可以进行更彻底的搜索,无疑会找到我找不到的信息。

我提出了三个建议供您尝试。我立即承认前两者不太可能解决您的问题,但是我仍然发现它们值得尝试。我保证,如果前两个都不起作用,那么第三个会起作用。

1。使用ThreeTenABP和java.time

我同意the answer by notyou的观点,认为DateSimpleDateFormat类已经过时,最好使用现代Java日期和时间API java.time。您可以在Android O之前的Android上执行此操作吗?是的,java.time的大多数已被反向移植。 backport的Android版本称为ThreeTenABP。使用底部的链接。然后尝试:

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);
    ZonedDateTime newDateTime
            = ZonedDateTime.parse("Fri Jun 22 09:29:29 NPT 2018", formatter);
    System.out.println(newDateTime);

确保将导入用于反向端口:

import org.threeten.bp.ZonedDateTime;
import org.threeten.bp.format.DateTimeFormatter;

我已经使用相同的反向端口进行了测试,但没有测试过Android版本。我得到了:

  

2018-06-22T09:29:29 + 05:45 [亚洲/加德满都]

我怀疑ThreeTenABP使用相同的语言环境数据,如果这样的话,这并不能解决您的问题。

2。在格式化程序上设置时区

    DateTimeFormatter formatter = DateTimeFormatter
            .ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT)
            .withZone(ZoneId.of("Asia/Kathmandu"));

如果可以,我觉得它简单明了。如果您坚持使用SimpleDateFormat,则可以尝试使用类似的技巧。我得到与上面相同的输出。

3。将NPT处理为文字文本

这是一个hack:要求字符串中出现三个字母NPT,而不将它们解释为时区。这样就无需将缩写识别为时区,因此可以使用。

    DateTimeFormatter formatter = DateTimeFormatter
            .ofPattern("EEE MMM dd HH:mm:ss 'NPT' yyyy", Locale.ROOT)
            .withZone(ZoneId.of("Asia/Kathmandu"));

我们还需要设置时区,因为这是Java唯一可以从中获取时区的地方。

但是TimeAgo需要一个日期

要获取Date的老式TimeAgo对象,请像这样转换:

    Date newDate = DateTimeUtils.toDate(newDateTime.toInstant());

链接