gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:24:06 27 4
gpt4 key购买 nike

所以我在使用 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它委托(delegate)给 IslamicChronology 的实例在包org.joda.time.DateTimeZone
  • 修改一个方法; assemble(Fields fields) :调用委托(delegate)的方法,然后将 fields.monthOfYear (可能还有 dayOfWeek)设置为您自己的 BasicMonthOfYearDateTimeField 的子类
  • BasicMonthOfYearDateTimeField 的子类然后可以在属性文件名称中查找月份(或日,如果 DayOfWeek...)名称。子类需要位于包 org.joda.time.chrono 中才能扩展 BasicMonthOfYearDateTimeField .

仍然存在一个问题,Joda 时间似乎在调用子类的方法(如 getAsText(int fieldValue, Locale locale) )之前验证您正在解析的日期。并且因为它不知道您的类返回的月份名称,因此验证失败,因此永远不会调用这些方法。我的解决方法是在此类中使用一个静态方法,它将日期作为带有伊斯兰月份名称的字符串转换为日期作为带有公历英语月份名称的字符串。所以在调用parseDateTime()之前,调用静态方法,然后日期字符串通过验证。然后,不要处理 convertText() 中的伊斯兰月份名称。方法,在子类中使用默认的公历实现:

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

这应该有效!希望这对遇到同样问题的人有意义。

关于java - Joda Time 错误还是我的错误? (Java Joda Time 日期作为字符串解析),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1525932/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com