【问题标题】:Convert string to date with IST使用 IST 将字符串转换为日期
【发布时间】:2017-04-14 08:30:59
【问题描述】:

我正在尝试通过解析 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:无法解析的日期:“星期一 6 月 18 日 00:00:00 IST 2012"(偏移量 20)04-14 12:35:53.367 22963-22963/com.trial W/System.err:在 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:在 android.view.View$PerformClick.run(View.java:21183) 04-14 12:35:53.367 22963-22963/com.trial W/System.err:在 android.os.Handler.handleCallback(Handler.java:739) 04-14 12:35:53.367 22963-22963/com.trial W/System.err:在 android.os.Handler.dispatchMessage(Handler.java:95) 04-14 12:35:53.367 22963-22963/com.trial W/System.err:在 android.os.Looper.loop(Looper.java:148) 04-14 12:35:53.367 22963-22963/com.trial W/System.err:在 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:在 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 中运行相同的代码时,它运行得非常好。

我想知道,我不知道,为什么会发生这种情况。 所以,我在另一个 Activity 中检查了按钮单击时的相同代码,但 不起作用

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

【问题讨论】:

  • 转换 IST 字符串非常棘手。我相信你得到的错误是因为'IST'。我可以知道时区是固定在 IST 上还是动态的?
  • 我从 json 中获取字符串,格式为“Mon Jun 18 00:00:00 IST 2012”。所以我不确定时区是否修复。
  • 如果可以,请远离三个字母的时区缩写。 IST 可能表示印度标准时间、爱尔兰标准时间或以色列标准时间。最好使用 Asia/KolkataEurope/DublinAsia/Tel_Aviv
  • 好的,下次会处理的。谢谢。
  • @KuldeepKulkarni 投反对票可能是因为您发帖时没有费心搜索已发布的关于该主题的数百(数千?)个问题和答案中的任何一个。

标签: java android date simpledateformat


【解决方案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 只是众多有用之一)可以通过the ThreeTenABP 在Android 上使用。这就是 JSR-310 的 ThreeTen 和 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");
}

【讨论】:

    【解决方案2】:

    尝试将格式更改为“EEE MMM dd HH:mm:ss yyyy”并设置 IST 时区

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

    【讨论】:

    • 仅供参考 这些麻烦的类现在是遗留的,被 java.time 类所取代。请参阅适用于 Android 的 ThreeTenABP 项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2011-11-28
    • 1970-01-01
    • 2018-03-09
    • 2015-08-24
    • 2017-01-07
    相关资源
    最近更新 更多