Python有一个非常方便的包,它可以解析几乎任何明确的日期,并在解析失败python-dateutil时提供有用的错误消息。与SimpleDateFormat类相比并不有利- AFAICT SimpleDateFormat只能处理一种精确的数据格式,并且错误消息没有粒度。
我已经浏览过Joda API,但看起来Joda也是这样--一次只能解析一种显式格式。
是否有复制python行为的包或库?还是我漏掉了什么东西?
发布于 2013-10-21 21:50:35
如果您真的想使用dateutils Python库,有一种方法。这有点不方便,但在最后你可以使用原件,而不是一个副本。
可以使用Jython运行dateutils库。缺点是,您不能直接使用Java中的原始datutils类。您必须实现一个包装器Jython类,它实现了一个Java接口。
但是首先,您必须准备自己的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安装到自己的diretory中。
下载Jython到并下载2.5.3JythonInstallerjar。不要使用具有beta状态的较高版本号。不确定安装工具是否能与这些beta版本一起工作。
2.在运行java -jar jython-installer-2.5.3.jar目录中安装Jython并选择标准安装类型并将其安装在目录中,例如~/jython2.5.3。
3.安装安装工具下载setup.py并运行~/jython2.5.3/bin/jython ez_setup.py。见Jython书附录A。
安装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.jar,并作为安装类型选择“独立(可调用的.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项目中创建一个接口,创建一个接口。这将作为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.用实现接口,在类路径的根目录中创建文件MyDateParser.py (在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和GregorianCalendar。在Jython中使用Java类是没有问题的。然后导入我们的Java接口DateutilParser。最后一个导入是针对dateutils解析器类的。然后创建Jython类MyDateParser,实现DateutilParser。在parsedate方法中,我们首先使用dateutil的parse()函数从字符串中创建日期,然后通过GregorianCalendar实例将其转换为java.util.Date对象。
10.创建一个MyDateParser实例拼图中的最后一部分是DateutilParserFactory类,它负责利用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书,第10章,在Java应用程序中使用Jython。
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发布于 2013-10-21 17:26:46
库中有DateUtils类,方法如下:
public static Date parseDate(String str, String[] parsePatterns) throws ParseException根据JavaDocs
通过尝试各种不同的解析器来解析表示日期的字符串。 该解析将依次尝试每个解析模式。只有解析整个输入字符串才被认为是成功的。如果解析模式不匹配,则抛出ParseException。 解析器将宽大处理解析的日期。
https://stackoverflow.com/questions/19454538
复制相似问题