【问题标题】:JodaTime not working乔达时间不工作
【发布时间】:2017-11-07 09:21:56
【问题描述】:

我是 android 新手,在使用 jodatime 时遇到了麻烦。我遇到了和这里很多人一样的错误,我已经尝试了所有的建议,但没有什么对我有用。我正在尝试显示用户从日期和时间选择器中选择的变量,例如'dayNow, monthNow' 等到一个名为 'timeselected' 的组合变量中,并将其设置为文本框,这样我就可以在 jodatime 中进一步进行计算。

代码如下:

            DateTime dateTime = new DateTime(timeselected);
            DateTimeFormatter fmt = DateTimeFormat.forPattern("dd MM yyyy" + "\n" + " h:mm a ");
            String formattedtime = fmt.print(dateTime);
            CalculateButton.setText(formattedtime);

            // Plus some hours, minutes, and seconds to the original DateTime.
            DateTimeFormatter fmt2 = DateTimeFormat.forPattern("dd MM yyyy" + "\n" + " h:mm a ");

            DateTime dateTime1 = dateTime.plusHours(timeadded);
            String endtimecalc = fmt2.print(dateTime1);
            TextView endtime = (TextView) findViewById(endtimetextView);
            endtime.setVisibility(View.VISIBLE);
            endtime.setText(endtimecalc);

            String timeselected = dayNow + "-" + monthNow + "-" + yearNow + " " + hourNow + ":" + minuteNow;

            DateTime datetimselected = DateTime.parse(timeselected);

            usertimeselection.setText((CharSequence) datetimselected.toDate());

        }
    });

致命异常:主要 进程:com.almac.tracker,PID:29114 java.lang.IllegalArgumentException:无效格式:“2017-11-23 T 4:56”在“T 4:56”格式错误 在 org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:945) 在 org.joda.time.DateTime.parse(DateTime.java:160) 在 org.joda.time.DateTime.parse(DateTime.java:149) 在 com.almac.tracker.CreateLine$5.onClick(CreateLine.java:274) 在 android.view.View.performClick(View.java:6219) 在 android.view.View$PerformClick.run(View.java:24482) 在 android.os.Handler.handleCallback(Handler.java:769) 在 android.os.Handler.dispatchMessage(Handler.java:98) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6540) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

【问题讨论】:

  • 这个肯定有重复,但是 Joda Time 对格式很挑剔;首先,您需要使用 - 而不是 / 分隔日期组件。有关更多信息,请参阅the docs - 例如,可能需要通过8-11-2017 T 4:16:00
  • 我已经把上面所有的相关代码都加进去了,请大家看看

标签: android jodatime android-jodatime


【解决方案1】:

来自DateTime.parse(String str) 文档:

从指定的字符串中解析一个 DateTime。

这使用 ISODateTimeFormat.dateTimeParser()。

您的日期时间字符串对于ISODateTimeFormat 无效,它不接受/ 但接受-

所以或者将您的/ 更改为- 并遵守规则: date-opt-time = date-element ['T' [time-element] [offset]](请参阅日期和时间元素之间的 'T'!) 所以你的日期时间字符串应该是这样的:

String timeselected = yearNow + "-" + monthNow + "-" + dayNow + "'T'" + hourNow + ":" + minuteNow;
DateTime datetimselected = DateTime.parse(timeselected);

或者通过DateTime.parse(String str, DateTimeFormatter formatter) 方法使用您自己的格式化程序。

更新 1

在运行一些测试后,'T' 确实不被默认解析器接受。从解析器传递的字符串是:

"2017-11-23T04:56"

所以请确保日期部分“T”字符和时间部分之间没有空格。

String timeselected = yearNow + "-" + monthNow + "-" + dayNow + "T" + hourNow + ":" + minuteNow;

更新 2

为解析器附加我的测试代码

public class Main {
    public static void main(String[] args) {
        String timeselected = "2017-11-23T04:56";
        DateTime datetimselected = DateTime.parse(timeselected);
        System.out.println(datetimselected.toDate());
    }
}

输出:

Thu Nov 23 04:56:00 EET 2017

【讨论】:

  • @Almac3 我已经用DateTime.parse的正确格式的日期时间字符串更新了我的答案
  • 试过了,但它不接受它,我们也在尝试在两个日期时间之间进行计算....格式是否重要以便在幕后进行计算?谢谢你
  • 哦,我看到它需要第一年,然后是月份,然后是一天,所以你的字符串应该是:yearNow + "-" + monthNow + "-" + dayNow + "'T'" + hourNow + ":" + minuteNow;我已经相应地更新了我的答案
  • 它仍然不允许我添加公共静态 DateTime 行
  • 什么“公共静态日期时间行”???根据我的回答?这是另一种选择(关键字:either)!如果它令人困惑,我将更新我的答案以删除它
猜你喜欢
  • 2019-08-04
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 2015-11-28
  • 2021-08-17
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多