当前位置: 首页 > 面试题库 >

Joda Time错误还是我的错误?(Java Joda Time日期作为字符串解析)

黎苑博
2023-03-14
问题内容

因此我在使用JodaTime年表解析日期时遇到问题,IslamicChronology因此写了一个小例子来演示我的问题。

这是代码:

import org.joda.time.Chronology;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.chrono.IslamicChronology;

import java.util.Date;

/**
 * Test
 */
public class Test
{
    public static void main(String[] args)
    {
        Date now = new Date();

        String format = "dd MMM yyyy";
        Chronology calendarSystem = IslamicChronology.getInstance();
        DateTimeFormatter formatter = DateTimeFormat.forPattern(format).withChronology(calendarSystem);

        String nowAsString = formatter.print(now.getTime());

        System.out.println("nowAsString = " + nowAsString);

        long parsedNowTs = formatter.parseMillis(nowAsString);

        String parsedNowTsAsString = formatter.print(parsedNowTs);
    }
}

并输出:

nowAsString = 16 10 1430
Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "16 10 1430" is malformed at "10 1430"
    at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:634)
    at test.Test.main(Test.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    ...

我在想问题是月份名称是数字,但是对吗?任何人有任何建议吗?如果年表是公历的,则无法重新创建。

提前致谢。


问题答案:

如果有人感兴趣…我发现了一个解决方法:

  • 创建一个新类,例如IslamicChronologyWithNames,它委托IslamicChronologyorg.joda.time.DateTimeZone中 的实例。 __
  • 修改一种方法;assemble(Fields fields):调用委托的方法,然后将fields.monthOfYear(可能还有dayOfWeek)设置为您自己的BasicMonthOfYearDateTimeField
  • 然后,BasicMonthOfYearDateTimeFieldcan 的子类可以在属性文件名称中查找月份名称(如果是DayOfWeek,则为天)。子类必须位于 org.joda.time.chrono 包中才能进行扩展BasicMonthOfYearDateTimeField

仍然存在一个问题,即Joda time似乎在调用子类的方法之前先验证要解析的日期getAsText(int fieldValue, Locale locale),因为并且它不知道类返回的月份名称,验证失败,因此从不调用方法。我的解决方法是在此类中使用静态方法,该方法将带有伊斯兰月份名称的日期转换为带有格里高里英语月份名称的日期作为字符串。因此,在调用之前parseDateTime(),先调用静态方法,然后日期字符串通过验证。然后,不要在convertText()方法中处理伊斯兰月份的名称,而是在子类中使用默认的gregorian实现:

protected int convertText(String text, Locale locale)
{
    return GJLocaleSymbols.forLocale(locale).monthOfYearTextToValue(text);
}

那应该工作!希望对遇到相同问题的任何人都有意义。



 类似资料:
  • 问题内容: 我有一个使用转换的字符串,现在我正尝试将其转换回来,但是当UIPicker启动时,这给了我错误的一天 我尝试了硬编码,但结果仍然相同。UIDatePicker上的日期在1991年12月22日开始。 如果我使用hardcore ,则从1979年12月23日开始。 (我不知道是不是这种情况,但是我在UIPickerView中有,但它是为字符串使用的。。我不认为是因为保存时,它保存了正确的值

  • 问题内容: 有一些与此相关的帖子,但是我对TSQL还是很陌生,无法理解它们,所以请原谅。 我的程序有: 如果我以这种方式执行它: 我收到此错误:从字符串转换日期时间时转换失败。 我该如何解决? 太感谢了 问题答案: 如果您查看CONVERT的文档,则会看到格式102是ANSI格式,即。因此,通过类似的日期应该可以。 它看起来也可以使用,但这不在文档格式中。

  • 为什么当我添加一个语义谓词(虽然这里是一个虚拟谓词)作为替代选项时,它总是说“第1行:5在输入' '处没有可行的替代选项”?如果我删除带有false语义谓词的替代选项,错误就会像预期的那样消失。 PS:我使用的是antlr-4.0-complete.jar

  • 问题内容: 我有一个名为的变量,它具有以下格式的今天的日期:。然后,将其格式化为MySQL的Date类型格式,即。这段代码可以做到: 我要做的是将其恢复为Date类型。我尝试了一些方法,但是它们没有用。主要解决方案是按照其他的问题中所述进行操作](http://codingdict.com/questions/2936),并通过一个小小的mod达到了我想要的功能: 但是它不起作用,因为尝试解析时出

  • 问题内容: 在注意到一个应用程序倾向于由于不正确的字符串值错误而丢弃随机电子邮件之后,我经过了并切换了许多文本列以使用列字符集和默认列归类(),以便它可以接受它们。这修复了大多数错误,并使应用程序在遇到非拉丁电子邮件时也停止出现sql错误。 尽管如此,某些电子邮件仍然导致程序遇到不正确的字符串值错误: 内容列是使用列字符集和列排序规则的数据类型。在此列中没有可切换的标志。 请记住,除非绝对必要,否

  • 问题内容: 我注意到了一些意外的行为(相对于我的个人期望而言是意外的),我想知道是否是JVM中存在错误,或者这可能是一种边缘情况,在这种情况下我不了解某些确切的细节应该发生。假设我们自己在main方法中具有以下代码: 天真的期望是这样会印刷,最大的甚至可以代表。但是,我认为整数算术应该在Java中“翻转”,因此将1加到会导致。由于仍小于,因此循环将循环遍历负数甚至整数。最终它将回到0,并且此过程应