使用IST

时间:2017-04-14 08:31:00

标签: java android date simpledateformat

我试图通过解析json字符串在 Asynctask 中将字符串转换为日期。我引用了这个链接: How to convert "Mon Jun 18 00:00:00 IST 2012" to 18/06/2012?

//String dateStr = "Mon Jun 18 00:00:00 IST 2012";

changedDate = jsonObjectMain.getString("date");
DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
Date date = (Date)formatter.parse(changedDate);
System.out.println(date);        

Calendar cal = Calendar.getInstance();
cal.setTime(date);
String formatedDate = cal.get(Calendar.DATE) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" +         cal.get(Calendar.YEAR);
System.out.println("formatedDate : " + formatedDate);  

当我在 android studio 中运行此代码时,它给出了以下异常:

  

04-14 12:35:53.363 22963-22963 / com.trial W / System.err:   java.text.ParseException:Unparseable date:“Mon Jun 18 00:00:00 IST   2012“(抵消20)04-14 12:35:53.367 22963-22963 / com.trial   W / System.err:at java.text.DateFormat.parse(DateFormat.java:579)   04-14 12:35:53.367 22963-22963 / com.trial W / System.err:at   com.trial.Activity.StartActivity.onClick(StartActivity.java:124)   04-14 12:35:53.367 22963-22963 / com.trial W / System.err:at   android.view.View.performClick(View.java:5210)04-14 12:35:53.367   22963-22963 / com.trial W / System.err:at   android.view.View $ PerformClick.run(View.java:21183)04-14 12:35:53.367   22963-22963 / com.trial W / System.err:at   android.os.Handler.handleCallback(Handler.java:739)04-14 12:35:53.367   22963-22963 / com.trial W / System.err:at   android.os.Handler.dispatchMessage(Handler.java:95)04-14 12:35:53.367   22963-22963 / com.trial W / System.err:at   android.os.Looper.loop(Looper.java:148)04-14 12:35:53.367   22963-22963 / com.trial W / System.err:at   android.app.ActivityThread.main(ActivityThread.java:5438)04-14   12:35:53.367 22963-22963 / com.trial W / System.err:at   java.lang.reflect.Method.invoke(Native Method)04-14 12:35:53.367   22963-22963 / com.trialW / System.err:at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:762)   04-14 12:35:53.367 22963-22963 / com.trial W / System.err:at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)

但是当我通过创建简单的程序在 eclipse 中运行相同的代码时,它运行得非常好。

我很想知道,我不知道,为什么会这样。 所以,我在按钮点击的另一个活动中检查了相同的代码,但是没有用

谢谢。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我知道在Android上使用较新的java.time类需要外部依赖(ThreeTenABP),而且你现在还有一个可行的解决方案。对于其他阅读的人来说,既可以使用Java 8或更高版本,也可以对库依赖感到满意,这里有以下几点:

String dateStr = "Mon Jun 18 00:00:00 IST 2012";

DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss z uuuu", Locale.ENGLISH);
LocalDate date = LocalDate.parse(dateStr, inputFormat);

String formattedDate = date.format(DateTimeFormatter.ofPattern("dd/MM/uuuu"));

System.out.println(formattedDate);

如果您事先知道该字符串包含正确的日,月和年,则可以完全忽略该时区。

链接:java.time类(其中LocalDate只是众多帮助中的一个)可以在Android上通过the ThreeTenABP使用。这是JSR-310的三十分之一和Android Backport的ABP。

PS如果你想进一步验证你的输入字符串,你可以检查时间部分是否等于指定时区内的一天的开始:

ZonedDateTime zdt = ZonedDateTime.parse(dateStr, inputFormat);
if (! zdt.equals(zdt.toLocalDate().atStartOfDay(zdt.getZone()))) {
    throw new IllegalArgumentException("Input date was not at midnight");
}

答案 1 :(得分:0)

尝试将格式更改为" EEE MMM dd HH:mm:ss yyyy"并设置IST timeZone

changedDate = changedDate.replace("IST ", "");
SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyy");
TimeZone timeZone=TimeZone.getTimeZone("IST");
formatter.setTimeZone(timeZone);

Date date = (Date)formatter.parse(changedDate);