当前位置: 首页 > 面试题库 >

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

毕霖
2023-03-14
问题内容

我正在服务器上工作,并且服务器在GMT本地日期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));

我需要的是取出Ago中的时间, 5 hours 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)


问题答案:

NPT不被视为时区缩写

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

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

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

1.使用ThreeTenABP和java.time

我同意您的回答,即类DateSimpleDateFormat过时了,最好使用java.time现代Java日期和时间API。您可以在Android
O之前的Android上执行此操作吗?是的,大多数java.time已被反向移植。反向端口的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());


 类似资料:
  • 问题内容: 从服务器上,我得到了这种格式的datetime变量:它是UTC时间。我想使用JavaScript将其转换为当前用户的浏览器时间。 如何使用JavaScript或jQuery完成此操作? 问题答案: 在将字符串转换为javascript中的日期之前,将’UTC’附加到字符串中:

  • 嗨,我有一个android应用程序,使用返回Int(或Long)类型的时间戳。我想将其转换为人类阅读器日期时间(根据设备时区) 例如,1175714200转换为GMT:2007年4月4日星期三19:16:40 GMT您的时区:2007年4月5日,3:16:40 AM GMT 8:00 我使用这个函数进行转换,但似乎没有返回正确的结果(所有结果都像(15/01/1970 04:04:25),这是不正

  • 我有一个带时区的日期(如2014年3月21日08:00:00)(“如美国/丹佛”),我想将该日期转换为格林尼治标准时间;我怎么能这样做? 我还想知道Oracle是否接受DST?它会自动处理吗?是否以相同的方式支持所有时区? 注:“来自时区”在每种情况下都会改变;所以,并不总是美国/丹佛

  • 问题内容: 有谁知道如何将JS dateTime转换为MySQL datetime?还有一种方法可以向JS日期时间添加特定的分钟数,然后将其传递给MySQL日期时间? 问题答案: 尽管JS确实拥有足够的基本工具来执行此操作,但它相当笨拙。

  • 问题内容: 我从来没有不得不将时间与UTC转换。最近有人要求我的应用注意时区,并且我一直在圈子里奔波。我发现很多有关将本地时间转换为UTC的信息,这很基本(也许我也做错了),但是我找不到任何有关将UTC时间轻松转换为最终用户时区的信息。 简而言之,android应用程序向我发送了(appengine应用程序)数据,该数据中包含时间戳。要将时间戳存储为UTC时间,我正在使用: 那似乎行得通。当我的应

  • 问题内容: 是否有一个内置的转换方法为在Python,例如获得在指定日期的午夜?相反的转换很容易:有一个方法。 我真的必须手动打电话吗? 问题答案: 您可以使用;现在,您创建一个初始化为午夜的对象。