[英]Convert Human Date (Local Time GMT) to date
我正在服务器上工作,并且服务器向我发送格林尼治标准时间本地日期的日期,如Fri Jun 22 09:29:29 NPT 2018
以字符串格式,并将其转换为日期,如下所示:
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
前一样取出Time in Ago,因为我使用了一个github项目,该项目在传递日期时返回TimeAgo 。
我已经看过这个答案,但没有解决我的问题。
异常:Err java.text.ParseException:不可解析的日期:“星期五6月22日09:29:29 NPT 2018”(偏移20)Err java.text.ParseException:无法解析的日期:“星期五6月22日09:29:29 NPT 2018 ”(偏移量为20)
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));
问题是您的日期时间字符串(显然是Date.toString()
的输出Date.toString()
的解析(不是随后对TimeAgo
使用,您可能没有在问题中使用它来使它更清楚)。 不可分割的部分在索引20处,即NPT
,我指的是尼泊尔时间。 因此,Android设备或仿真器上的SimpleDateFormat
无法将NPT
识别为时区缩写。
时区缩写是语言环境数据的一部分。 我不是Android开发人员,也不知道Android从何处获取其区域设置数据。 快速网络搜索提到了ICU和CLDR。 您可以进行更彻底的搜索,无疑可以找到我没有找到的信息。
我提出了三个建议供您尝试。 我立即承认前两者不太可能解决您的问题,但是我仍然发现它们值得尝试。 我保证,如果前两个不起作用,则第三个将起作用。
我同意您的回答,即类Date
和SimpleDateFormat
已过时,最好使用现代Java日期和时间API java.time
。 您可以在Android O之前的Android上执行此操作吗? 是的,大多数java.time
已被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使用相同的语言环境数据,如果这样的话,这不能解决您的问题。
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT)
.withZone(ZoneId.of("Asia/Kathmandu"));
如果可行,我觉得它简单明了。 如果您坚持使用SimpleDateFormat
,则可以尝试使用类似的技巧。 我得到与上述相同的输出。
这是一个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());
java.time
。 java.time
。 java.time
到Java 6和7的java.time
移植(JSR-310的ThreeTen)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.