Java 如何解析字符串;8月8日星期一16:44:19吃2016”;迄今为止,安卓系统

Java 如何解析字符串;8月8日星期一16:44:19吃2016”;迄今为止,安卓系统,java,android,date,android-studio,Java,Android,Date,Android Studio,我尝试使用3种不同的区域格式“z”、“zzz”、“zzz”解析此日期,但都抛出java.text.ParseException:不可解析日期:“Mon Aug 08 16:44:19 EAT 2016”(偏移量20)您必须添加区域设置: private void parseDate() { String p_localDateTime = "Mon Aug 08 16:44:19 EAT 2016"; SimpleDateFormat lv_formatter

我尝试使用3种不同的区域格式“z”、“zzz”、“zzz”解析此日期,但都抛出java.text.ParseException:不可解析日期:“Mon Aug 08 16:44:19 EAT 2016”(偏移量20)

您必须添加区域设置:

  private void parseDate() {
        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_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.ENGLISH);

我这边的代码没有错误。我做了一些改变,试图输出结果并得到这个结果

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


使用Jdk1.6这里是我在项目中使用的一个实用函数。只需传递字符串和日期的格式。在这种情况下,日期格式将是“EEE MMM dd HH:mm:ss Z yyyy”。希望对你有帮助

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

如以下链接所述,根据SimpleDataFormat文档,时区似乎不接受“ZZZ”格式。 链接是:

我之所以能够解决这个问题,是因为我把这个区域称为“东非时间”,而不是“吃” 代码是:

public static Date dateFormatter(String dateString, String dateFormat) {

    SimpleDateFormat setDateFormatter = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
    Date formattedDate = null;
    if (!dateString.isEmpty()) {
        try {
            formattedDate = setDateFormatter.parse(dateString);
        } catch (ParseException e) {
            Log.e(TAG, "Parse Exception Error : " + e.getMessage());
        }
    }

    return formattedDate;
}

您使用的是麻烦的旧日期时间类,现在已被java.time类取代

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

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

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 );
zdt:2016-08-08T16:44:19+03:00[非洲/内罗毕]

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

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步适应于中(请参阅)


该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如
Interval
YearWeek
YearQuarter
,等等。

谢谢Jens的回复,但添加Locale后仍会引发相同的异常。ENGLISH,您能检查一下我是否还需要什么吗do@CoderAndroid我自己也试过了。它的工作原理很好,你可以请张贴完整的代码,你已经尝试。“这将有助于解决我的问题。”CoderAndroid在我的答案中添加了at。如您所见,我复制了您的示例并只添加了区域设置。感谢您的回答,我能够使用java编译器使用上述函数解析日期,但当我尝试在android studio中使用相同的方法时,问题就出现了。在android中它抛出了异常,但在java编译器中它工作得很好。仅供参考:
EAT
是东非时间。感谢大家的回答,我能够使用java编译器使用上述函数解析日期,但当我尝试在安卓studio中使用相同的方法时,问题就出现了。在android中,它抛出异常,但在java编译器中它可以工作fine@CoderAndroid将更多信息发布为对问题的编辑,而不是评论。感谢您的回答,我能够使用java编译器使用上述函数解析日期,但当我尝试在android studio中使用相同的方法时,问题就出现了。在android中,它抛出异常,但在java编译器中,它运行良好。您可以检查一下是否可以解析日期-“Mon Aug 08 16:44:19 EAT 2016”。我在studio中遇到解析异常,如果我使用其他java编译器,它可以正常工作。它将解析“Mon-Aug 08 16:44:19 IST 2016”,但不会解析“Mon-Aug 08 16:44:19 EAT 2016”。尝试像这样使用大写Z“EEE-MMM-dd-HH:mm:ss Z-yyyy”并让我知道。它适用于棒棒糖下面的设备,但不会解析棒棒糖上面的设备。因此,它现在正在解析“Mon-Aug 08 16:44:19 EAT 2016”在使用Z后正确,但仅在棒棒糖前的设备上正确吗?即使我们使用小的“Z”,它也会在棒棒糖前的设备上解析。
 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);

    }
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 );
System.out.println ( "zdt: " + zdt );