gpt4 book ai didi

java - python-dateutil的Java版本

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:27:37 25 4
gpt4 key购买 nike

Python有一个非常方便的软件包,可以解析几乎所有明确的日期,并在解析失败时提供有用的错误消息python-dateutil。与SimpleDateFormat类进行比较是不利的-AFAICT SimpleDateFormat仅能处理一种确切的日期格式,并且错误消息没有粒度。

我查看了Joda API,但看上去Joda是相同的方式-一次只能解析一种显式格式。

是否有任何可重现python-dateutil行为的包或库?还是我缺少WRT Joda/SimpleDateFormat?

最佳答案

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

您可以使用Jython运行dateutils库。缺点是您不能直接使用Java原始的datutils类。您必须实现一个实现Java接口(interface)的包装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.3 Jython安装程序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解释器并分析示例日期字符串来检查安装。
~$ ~/jython2.5.3/bin/jython
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:48:36)
[OpenJDK 64-Bit Server VM (Sun Microsystems Inc.)] on java1.6.0_27
Type "help", "copyright", "credits" or "license" for more information.
>>> from dateutil.parser import *
>>> parse('Oct 5, 2013')
datetime.datetime(2013, 10, 5, 0, 0)
>>>

到目前为止,它仍然有效。现在,您确定dateutils库与Jython兼容。

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

6.在jython.jar中安装dateutils库
我的第一次尝试是将 ~/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目录直接在 ~/jar/Lib下。

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

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

8.创建一个Java接口(interface)
在您的Java项目中,创建一个Java接口(interface)。这将充当Java与Jython世界之间的桥梁。稍后,您将创建一个实现此接口(interface)的Jython类。从Java代码中,您将通过此接口(interface)使用此Jython类。

在此示例中,我将接口(interface) DateutilParser命名为 dateutilstest包。
package dateutiltest;

import java.util.Date;

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

因此,唯一的方法接受字符串作为参数并返回 java.util.Date。 Java方面没有什么特别的地方。

9.与Jython一起实现
在类路径的根目录(在Eclipse的 src目录的根目录)中创建文件MyDateParser.py。
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类 DateGregorianCalendar。在Jython中使用Java类是没有问题的,并且很直接。然后,我们导入Java接口(interface) DateutilParser。最后一次导入是针对dateutils解析器类的。然后,创建实现 MyDateParser的Jython类 DateutilParser。在 parsedate方法中,我们首先使用dateutil的 parse()函数从字符串中创建日期,然后通过 GregorianCalendar实例将其转换为 java.util.Date对象。

10.创建一个MyDateParser实例
难题的最后一部分是 DateutilParserFactory Java类,该类负责利用Jython解释器创建 MyDateParser实例,并通过 DateutilParser接口(interface)提供对它的访问:
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

关于java - python-dateutil的Java版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19454538/

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