代码之家  ›  专栏  ›  技术社区  ›  Queendevelopers

将人工日期(本地时间GMT)转换为日期

  •  -1
  • Queendevelopers  · 技术社区  · 7 年前

    我正在服务器上工作,服务器正在发送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));
    

    我需要的是把过去的时光 5 hours ago 为此我用那个 github project on which returns TimeAgo on passing date .

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

    例外:Err java. Tr.PaSeExe:不可解析日期:“FRI 6月22日09:29∶29 NPT 2018”(在偏移20) Err java. Tr.PaSeExe:不可解析的日期:“FRI 6月22日09:29∶29 NPT 2018”(在偏移20)

    2 回复  |  直到 7 年前
        1
  •  2
  •   Anonymous    7 年前

    NPT不被理解为时区缩写

    对日期时间字符串的解析(显然是从 Date.toString() )是问题(不是随后使用 TimeAgo 你可以从问题中省去让它更清楚。不可分割的部分在索引20,这就是它所说的 NPT ,我认为是指尼泊尔时间。所以 SimpleDateFormat 在你的android设备或模拟器上无法识别 不扩散核武器条约 作为时区缩写。

    时区缩写是区域设置数据的一部分。我不是一个android开发人员,也不知道android从哪里获得本地数据。一个快速的网络搜索提到了icu和cldr。你可以更彻底地搜索,毫无疑问可以找到我没有找到的信息。

    我提出三个建议供你尝试。我马上承认前两个不太可能解决你的问题,但我还是觉得值得一试。我保证,如果前两个不成立,第三个会起作用。

    1。使用threetenabp和java.time

    我同意 the answer by notyou 那些班级 Date 日期格式 已经过时了,最好使用 java.time ,现代Java日期和时间API。在android o之前你能在android上做到吗?是的,大部分 Java.时间 已经被转移了。安卓版的backport被称为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[亚洲/加德满都]

    我怀疑3EtEnabbp使用相同的区域数据,如果是这样的话,这并不能解决您的问题。

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

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

    如果有效的话,我觉得它简单明了。如果你坚持使用 日期格式 ,你也可以试试类似的把戏。我得到的输出和上面一样。

    三。用文字处理NPT

    这是一个技巧:要求这三个字母 不扩散核武器条约 在字符串中发生而不将它们解释为时区。这消除了缩略语被识别为时区的需要,因此将工作。

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

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

    但时间需要约会

    得到一个老式的 日期 对象 泰晤士报 ,转换如下:

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

    链接

        2
  •  2
  •   achAmháin    7 年前

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

    或许可以考虑使用 ZonedDateTime 为你的问题上课。

    如果你只是在 String 发送给您,您可以使用以下内容:

    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));