pythondateuti的java版本

2024-10-03 17:21:20 发布

您现在位置:Python中文网/ 问答频道 /正文

Python有一个非常方便的包,可以解析几乎任何明确的日期,并在解析失败时提供有用的错误消息python-dateutil。与SimpleDateFormat类相比不太好—一个AICT SimpleDateFormat只能处理一个精确的日期格式,并且错误消息没有粒度。在

我已经看过了Joda API,但是Joda似乎也是这样的-一次只能解析一个显式格式。在

是否有任何包或库可以复制python dateutil行为?或者我遗漏了一些与Joda/SimpleDateFormat相关的内容?在


Tags: api消息内容格式错误粒度dateutil遗漏
2条回答

apache commons lang库中有一个DateUtils类,方法是:

public static Date parseDate(String str, String[] parsePatterns) throws ParseException

根据JavaDocs

Parses a string representing a date by trying a variety of different parsers.

The parse will try each parse pattern in turn. A parse is only deemed successful if it parses the whole of the input string. If no parse patterns match, a ParseException is thrown.

The parser will be lenient toward the parsed date.

如果您真的想使用dateutils Python库,有一种方法。这有点不方便,但最后你可以用原件而不是复印件。在

可以使用Jython运行dateutils库。缺点是,您不能直接使用Java中原始的datutils类。您必须实现一个实现Java接口的包装器Jython类。在

但首先您必须准备自己的自定义副本jython.jar。在

Jython可以用不同的方式使用。第一种方法是在自己的目录中安装类似于Python的Jython。有了它,您可以像普通Python一样使用Jython。您可以运行Jython脚本,通过安装工具安装库等

另一种方法是使用独立的jython.jar。独立的jython.jar包含整个Jython系统。您也可以使用这个JAR运行Jython脚本。但是将整个Jython系统打包到一个JAR中的主要目的是将其嵌入到Java应用程序中,并从Java调用Jython/Python代码(反之亦然)。在

dateutils库不是Python/Jython标准库的一部分。所以你不能按原样使用它。要创建自己的jython.jar,必须首先将Jython安装到它自己的目录中。在

1。下载Jython 进入Jython download page并下载2.5.3jython安装程序JAR。不要使用beta状态的更高版本号。不确定安装工具是否能与这些beta版本一起工作。在

2。在目录中安装Jython 运行java -jar jython-installer-2.5.3.jar并选择标准安装类型并将其安装到一个目录中,例如~/jython2.5.3。在

3。安装安装工具 下载http://peak.telecommunity.com/dist/ez_setup.py并运行~/jython2.5.3/bin/jython ez_setup.py。参见Jython book appendix A。在

4。安装dateutils 下载dateutils库的1.5版本:http://labix.org/download/python-dateutil/python-dateutil-1.5.tar.gz。此版本适用于Python<;3.0。 解压归档文件并生成并安装:

~/jython2.5.3/bin/jython setup.py build
~/jython2.5.3/bin/jython setup.py install

之后,您的Jython安装应该包含位于~/jython2.5.3/Lib/site-packages/python_dateutil-1.5-py2.5.egg/dateutil的datetuils库。在

您可以通过运行Jython解释器并解析一个示例日期字符串来检查安装情况。在

^{pr2}$

所以到目前为止还有效。现在您可以确定dateutils库与Jython兼容。在

5。创建默认的独立jython.jar 再次运行Jython安装程序,并作为安装类型选择“Standalone(a callable.jar file)”。之后,将生成的JAR文件(您可以使用每个ZIP解压工具)解压到一个目录中,例如~/JAR。在

6。在中安装dateutils库jython.jar 我的第一次尝试是将~/jython2.5.3/Lib/site-packages/python_dateutil-1.5-py2.5.egg目录复制到~/jar/Lib/site-packages。但这在嵌入式模式下不起作用。您必须将~/jython2.5.3/Lib/site-packages/python_dateutil-1.5-py2.5.egg/dateutil复制到~/jar/Lib,这样dateutil目录就在^{之下。在

7。创建自定义jython.jar 现在压缩结果~/jar,并将其命名为jython.jar。通过运行java -jar jython.jar来尝试。这将从您的jython.jar启动一个Jython解释器。尝试使用dateutils分析日期。在

现在,只需将自定义的jython.jar放在类路径上,就可以在Java项目中包含一个包括dateutils库的整个Jython系统。在

8。创建Java接口 在Java项目中创建Java接口。这将成为Java和Jython世界之间的桥梁。稍后,您将创建一个实现此接口的Jython类。在Java代码中,您将通过这个接口使用这个Jython类。在

在本例中,我调用接口DateutilParser,并将其放入dateutilstest包中。在

package dateutiltest;

import java.util.Date;

public interface DateutilParser {
  Date parsedate(String s);
}

所以唯一的方法接受一个字符串作为参数并返回一个java.util.Date。这里没有什么特别的Java方面。在

9。用Jython实现接口 创建文件MyDateParser.py在类路径的根目录中(在Eclipse中,src目录的根目录)。在

import java.util.Date as Date
import java.util.GregorianCalendar as GregorianCalendar
import dateutiltest.DateutilParser as DateutilParser
from dateutil.parser import *


class MyDateParser(DateutilParser):
    def parsedate(self, s):
        d = parse(s)
        g = GregorianCalendar(d.year, d.month, d.day)
        return g.getTime()

首先,我们导入Java类Date和{}。这是没有问题的在Jython中使用Java类。然后我们导入Java接口DateutilParser。最后一次导入是针对dateutils解析器类的。然后我们创建Jython类MyDateParser实现DateutilParser。在parsedate方法中,我们首先使用dateutil的parse()函数从字符串中创建一个日期,然后通过GregorianCalendar实例将其转换为java.util.Date对象。在

10。创建MyDateParser实例 难题的最后一部分是DateutilParserFactoryJava类,它负责利用Jython解释器创建一个MyDateParser实例,并通过DateutilParser接口提供对它的访问:

package dateutiltest;

import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

public class DateutilParserFactory {
  private PyObject parserClass;

  /**
   * Create a new PythonInterpreter object, then use it to
   * execute some python code. In this case, we want to
   * import the python module that we will coerce.
   *
   * Once the module is imported than we obtain a reference to
   * it and assign the reference to a Java variable
   */
  public DateutilParserFactory() {
    final PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.exec("from MyDateParser import MyDateParser");
    parserClass = interpreter.get("MyDateParser");
  }

  /**
   * The create method is responsible for performing the actual
   * coercion of the referenced python module into Java bytecode
   */
  public DateutilParser create() {
    PyObject buildingObject = parserClass.__call__(); 
    return (DateutilParser) buildingObject.__tojava__(DateutilParser.class);
  }
}

有关详细信息,请参阅Jython book, chapter 10, Using Jython Within Java Applications。在

11。使用它 在本例中,我创建了一个Main类来演示其功能:

package dateutiltest;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
  public static void main(String[] args) {
    final DateutilParserFactory fac = new DateutilParserFactory();
    final DateutilParser parser = fac.create();
    final Date d = parser.parsedate("Oct 5, 2013");
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(sdf.format(d));
  }
}

输出是:

2013-11-05

相关问题 更多 >