<p>如果您真的想使用dateutils Python库,有一种方法。这有点不方便,但最后你可以用原件而不是复印件。在</p>
<p>可以使用<a href="http://www.jython.org/" rel="nofollow">Jython</a>运行dateutils库。缺点是,您不能直接使用Java中原始的datutils类。您必须实现一个实现Java接口的包装器Jython类。在</p>
<p>但首先您必须准备自己的自定义副本<code>jython.jar</code>。在</p>
<p>Jython可以用不同的方式使用。第一种方法是在自己的目录中安装类似于Python的Jython。有了它,您可以像普通Python一样使用Jython。您可以运行Jython脚本,通过安装工具安装库等</p>
<p>另一种方法是使用独立的<code>jython.jar</code>。独立的<code>jython.jar</code>包含整个Jython系统。您也可以使用这个JAR运行Jython脚本。但是将整个Jython系统打包到一个JAR中的主要目的是将其嵌入到Java应用程序中,并从Java调用Jython/Python代码(反之亦然)。在</p>
<p>dateutils库不是Python/Jython标准库的一部分。所以你不能按原样使用它。要创建自己的<code>jython.jar</code>,必须首先将Jython安装到它自己的目录中。在</p>
<p><strong>1。下载Jython</strong>
进入<a href="http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.python%22%20AND%20v%3A%222.5.3%22" rel="nofollow">Jython download page</a>并下载2.5.3jython安装程序JAR。不要使用beta状态的更高版本号。不确定安装工具是否能与这些beta版本一起工作。在</p>
<p><strong>2。在目录中安装Jython</strong>
运行<code>java -jar jython-installer-2.5.3.jar</code>并选择标准安装类型并将其安装到一个目录中,例如<code>~/jython2.5.3</code>。在</p>
<p><strong>3。安装安装工具</strong>
下载<a href="http://peak.telecommunity.com/dist/ez_setup.py" rel="nofollow">http://peak.telecommunity.com/dist/ez_setup.py</a>并运行<code>~/jython2.5.3/bin/jython ez_setup.py</code>。参见<a href="http://www.jython.org/jythonbook/en/1.0/appendixA.html#setuptools" rel="nofollow">Jython book appendix A</a>。在</p>
<p><strong>4。安装<code>dateutils</code>库</strong>
下载<code>dateutils</code>库的1.5版本:<a href="http://labix.org/download/python-dateutil/python-dateutil-1.5.tar.gz" rel="nofollow">http://labix.org/download/python-dateutil/python-dateutil-1.5.tar.gz</a>。此版本适用于Python<;3.0。
解压归档文件并生成并安装:</p>
<pre><code>~/jython2.5.3/bin/jython setup.py build
~/jython2.5.3/bin/jython setup.py install
</code></pre>
<p>之后,您的Jython安装应该包含位于<code>~/jython2.5.3/Lib/site-packages/python_dateutil-1.5-py2.5.egg/dateutil</code>的datetuils库。在</p>
<p>您可以通过运行Jython解释器并解析一个示例日期字符串来检查安装情况。在</p>
^{pr2}$
<p>所以到目前为止还有效。现在您可以确定dateutils库与Jython兼容。在</p>
<p><strong>5。创建默认的独立jython.jar</strong>
再次运行Jython安装程序,并作为安装类型选择“Standalone(a callable.jar file)”。之后,将生成的JAR文件(您可以使用每个ZIP解压工具)解压到一个目录中,例如~/JAR。在</p>
<p><strong>6。在中安装dateutils库jython.jar</strong>
我的第一次尝试是将<code>~/jython2.5.3/Lib/site-packages/python_dateutil-1.5-py2.5.egg</code>目录复制到<code>~/jar/Lib/site-packages</code>。但这在嵌入式模式下不起作用。您必须将<code>~/jython2.5.3/Lib/site-packages/python_dateutil-1.5-py2.5.egg/dateutil</code>复制到<code>~/jar/Lib</code>,这样<code>dateutil</code>目录就在^{<cd14>之下。在</p>
<p><strong>7。创建自定义jython.jar</strong>
现在压缩结果<code>~/jar</code>,并将其命名为<code>jython.jar</code>。通过运行<code>java -jar jython.jar</code>来尝试。这将从您的<code>jython.jar</code>启动一个Jython解释器。尝试使用dateutils分析日期。在</p>
<p>现在,只需将自定义的<code>jython.jar</code>放在类路径上,就可以在Java项目中包含一个包括dateutils库的整个Jython系统。在</p>
<p><strong>8。创建Java接口</strong>
在Java项目中创建Java接口。这将成为Java和Jython世界之间的桥梁。稍后,您将创建一个实现此接口的Jython类。在Java代码中,您将通过这个接口使用这个Jython类。在</p>
<p>在本例中,我调用接口<code>DateutilParser</code>,并将其放入<code>dateutilstest</code>包中。在</p>
<pre><code>package dateutiltest;
import java.util.Date;
public interface DateutilParser {
Date parsedate(String s);
}
</code></pre>
<p>所以唯一的方法接受一个字符串作为参数并返回一个<code>java.util.Date</code>。这里没有什么特别的Java方面。在</p>
<p><strong>9。用Jython实现接口</strong>
创建文件MyDateParser.py在类路径的根目录中(在Eclipse中,<code>src</code>目录的根目录)。在</p>
<pre><code>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()
</code></pre>
<p>首先,我们导入Java类<code>Date</code>和{<cd27>}。这是没有问题的在Jython中使用Java类。然后我们导入Java接口<code>DateutilParser</code>。最后一次导入是针对dateutils解析器类的。然后我们创建Jython类<code>MyDateParser</code>实现<code>DateutilParser</code>。在<code>parsedate</code>方法中,我们首先使用dateutil的<code>parse()</code>函数从字符串中创建一个日期,然后通过<code>GregorianCalendar</code>实例将其转换为<code>java.util.Date</code>对象。在</p>
<p><strong>10。创建MyDateParser实例</strong>
难题的最后一部分是<code>DateutilParserFactory</code>Java类,它负责利用Jython解释器创建一个<code>MyDateParser</code>实例,并通过<code>DateutilParser</code>接口提供对它的访问:</p>
<pre><code>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);
}
}
</code></pre>
<p>有关详细信息,请参阅<a href="http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html#using-jython-within-java-applications" rel="nofollow">Jython book, chapter 10, Using Jython Within Java Applications</a>。在</p>
<p><strong>11。使用它</strong>
在本例中,我创建了一个<code>Main</code>类来演示其功能:</p>
<pre><code>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));
}
}
</code></pre>
<p>输出是:</p>
<pre><code>2013-11-05
</code></pre>