如何在android中解析字符串“Mon Aug 08 16:44:19 EAT 2016”到目前为止

时间:2016-08-23 05:44:49

标签: java android date android-studio

echo.call(undefined, "print me");

我试图使用3种不同的区域格式'z','zzz','zzzz'来解析这个日期但是所有抛出java.text.ParseException:Unparseable date:“Mon Aug 08 16:44:19 EAT 2016” (抵消20)

5 个答案:

答案 0 :(得分:4)

您必须添加区域设置:

lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.ENGLISH);

完整示例:

      String p_localDateTime = "Mon Aug 08 16:44:19 EAT 2016";
        SimpleDateFormat lv_formatter,lv_parser;
        String lv_localTimeZone ="";
        lv_localTimeZone="EAT";
        Date lv_localDate = null;

        lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.ENGLISH);          //lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
        //lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy");
        lv_parser.setTimeZone(TimeZone.getTimeZone(lv_localTimeZone));
        try {
            lv_localDate = lv_parser.parse(p_localDateTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("convertLocalTimeToUTC: ");

答案 1 :(得分:1)

如下面的链接所示,根据SimpleDateFormat文档,时区似乎不接受“ZZZ”格式。 链接是: Simpledateformat ParseException

我能够通过将区域称为“东非时间”而不是“EAT”来解决这个问题 代码是:

 public void  dateFormatter() {
  String dateString = "Mon Aug 23 8:42:19 East Africa Time 2016";
  String dateFormat= "EEE MMM dd HH:mm:ss z yyyy";
        SimpleDateFormat setDateFormatter;
        Date formattedDate = null;
        if(!dateString.isEmpty()) {
            setDateFormatter = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
            try {
                formattedDate = setDateFormatter.parse(dateString);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Formatted Date: " + formattedDate);

    }

答案 2 :(得分:0)

我的代码没有错误。我改变了一下尝试输出结果并得到这个

“convertLocalTimeToUTC:Mon Aug 08 21:44:19 SGT 2016”

package self.test.out;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class DateParseTest {

    public static void main(String[] args) {
        String p_localDateTime = "Mon Aug 08 16:44:19 EAT 2016";
        SimpleDateFormat lv_formatter,lv_parser;
        String lv_localTimeZone ="";
        lv_localTimeZone="EAT";
        Date lv_localDate = null;

        lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
        //lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
        //lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy");
        lv_parser.setTimeZone(TimeZone.getTimeZone(lv_localTimeZone));
        try {
            lv_localDate = lv_parser.parse(p_localDateTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("convertLocalTimeToUTC: "+lv_localDate);
    }
}

使用Jdk1.6

答案 3 :(得分:0)

这是我在项目中使用的实用程序功能。只需传递字符串和日期格式即可。在这种情况下,dateformat将是“EEE MMM dd HH:mm:ss Z yyyy”。希望它有所帮助。

mymodule

答案 4 :(得分:0)

您正在使用现在由java.time类取代的麻烦的旧日期时间类。

使用java.time

避免将EAT用作区域。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。指定proper time zone name。在这种特殊情况下,java.time能够将其转换为Africa/Nairobi区域。

String input = "Mon Aug 08 16:44:19 EAT 2016";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" ).withLocale ( Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );

转储到控制台。 toString方法生成标准ISO 8601格式的字符串,通过在括号中附加区域名称进行扩展。当您需要将日期时间值序列化为文本时,这些标准格式是更好的选择。

System.out.println ( "zdt: " + zdt );
  

zdt:2016-08-08T16:44:19 + 03:00 [非洲/内罗毕]

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。