首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python-dateutil的java版本

python-dateutil的java版本
EN

Stack Overflow用户
提问于 2013-10-18 16:27:40
回答 2查看 1.8K关注 0票数 4

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

我已经浏览过Joda API,但看起来Joda也是这样--一次只能解析一种显式格式。

是否有复制python行为的包或库?还是我漏掉了什么东西?

EN

回答 2

Stack Overflow用户

发布于 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。解压存档并构建并安装它:

代码语言:javascript
复制
~/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解释器并解析一个示例日期字符串来检查安装。

代码语言:javascript
复制
~$ ~/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包中。

代码语言:javascript
复制
package dateutiltest;

import java.util.Date;

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

因此,唯一的方法接受字符串作为参数,并返回一个java.util.Date。这里对Java来说没什么特别的。

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

代码语言:javascript
复制
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接口DateutilParser。最后一个导入是针对dateutils解析器类的。然后创建Jython类MyDateParser,实现DateutilParser。在parsedate方法中,我们首先使用dateutil的parse()函数从字符串中创建日期,然后通过GregorianCalendar实例将其转换为java.util.Date对象。

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

代码语言:javascript
复制
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类来演示该功能:

代码语言:javascript
复制
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));
  }
}

产出如下:

代码语言:javascript
复制
2013-11-05
票数 3
EN

Stack Overflow用户

发布于 2013-10-21 17:26:46

库中有DateUtils类,方法如下:

代码语言:javascript
复制
public static Date parseDate(String str, String[] parsePatterns) throws ParseException

根据JavaDocs

通过尝试各种不同的解析器来解析表示日期的字符串。 该解析将依次尝试每个解析模式。只有解析整个输入字符串才被认为是成功的。如果解析模式不匹配,则抛出ParseException。 解析器将宽大处理解析的日期。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19454538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档