4

Python には、ほぼすべての明確な日付を解析でき、解析の失敗時に役立つエラー メッセージを提供する非常に便利なパッケージpython-dateutil があります。SimpleDateFormat クラスとの比較は好ましくありません。AFAICT SimpleDateFormat は 1 つの正確な日付形式しか処理できず、エラー メッセージには粒度がありません。

Joda APIを調べましたが、 Jodaも同じように見えます。一度に解析できる明示的な形式は 1 つだけです。

python-dateutil の動作を再現するパッケージまたはライブラリはありますか? または、WRT Joda/SimpleDateFormat が不足していますか?

4

2 に答える 2

2

本当に dateutils Python ライブラリを使用したい場合は、方法があります。少し不便ですが、最終的にはコピーではなくオリジナルを使用できます。

Jythonを使用して dateutils ライブラリを実行できます。欠点は、Java から元の datutils クラスを直接使用できないことです。Java インターフェースを実装するラッパー Jython クラスを実装する必要があります。

ただし、最初に の独自のカスタム コピーを準備する必要がありますjython.jar

Jython はさまざまな方法で使用できます。最初の方法は、Python に似た Jython を独自のディレクトリにインストールすることです。これで普通の Python のように Jython を使えます。Jython スクリプトを実行したり、セットアップ ツールを介してライブラリをインストールしたりできます。

もう 1 つの方法は、スタンドアロン を使用することjython.jarです。スタンドアロンjython.jarには、Jython システム全体が含まれています。この JAR を使用して Jython スクリプトを実行することもできます。しかし、Jython システム全体を 1 つの JAR にパックする主な目的は、それを Java アプリケーションに組み込み、Java から Jython/Python コードを呼び出す (またはその逆) ことです。

dateutils ライブラリは、Python/Jython 標準ライブラリの一部ではありません。なのでそのままでは使えません。独自のディレクトリを作成するjython.jarには、まず Jython を独自のディレクトリにインストールする必要があります。

1. Jython のダウンロード Jython ダウンロード ページに移動し、2.5.3 Jython インストーラー JAR をダウンロードします。ベータ ステータスでは、より高いバージョン番号を使用しないでください。セットアップ ツールがこれらのベータ バージョンで動作するかどうかは不明です。

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.pyJython ブックの付録 Aを参照してください。

4. ライブラリのインストールdateutilsライブラリ の 1.5 バージョンをダウンロードしdateutilsます: 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 インストールには、datetuils ライブラリーが含まれているはず~/jython2.5.3/Lib/site-packages/python_dateutil-1.5-py2.5.egg/dateutilです。

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 ファイル (すべての 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/Libdateutil~/jar/Lib

7. カスタム jython.jar を作成 する 結果を zip して~/jar、名前を付けますjython.jar。を実行してみてくださいjava -jar jython.jar。これにより、 から Jython インタープリターが開始されますjython.jar。dateutils で日付を解析してみてください。

カスタムをクラスパスに配置するだけで、dateutils ライブラリを含む Jython システム全体を Java プロジェクトに含めることができるようになりjython.jarました。

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 とのインターフェースの実装 クラスパスのルート (Eclipse ではディレクトリのルート) にファイル 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 クラスDateGregorianCalendar. Jython 内で Java クラスを使用することは問題なく、簡単です。次に、Java インターフェイスをインポートしますDateutilParser。最後のインポートは、dateutils パーサー クラス用です。MyDateParser次に、 を実装する Jython クラスを作成しますDateutilParser。このparsedateメソッドでは、最初に dateutil の関数を使用して文字列から日付を作成し、インスタンスをparse()介してオブジェクトに変換します。GregorianCalendarjava.util.Date

10. MyDateParser インスタンスを作成する パズルの最後の部分はDateutilParserFactory、Jython インタープリターを使用してインスタンスを作成し、インターフェースMyDateParserを介してインスタンスへのアクセスを提供するJava クラスです。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 章「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
于 2013-10-21T21:50:35.153 に答える
0

メソッドを使用して、apache-commons-lang ライブラリに DateUtils クラスがあります。

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

JavaDocsによると:

さまざまなパーサーを試して、日付を表す文字列を解析します。

解析では、各解析パターンが順番に試行されます。入力文字列全体を解析した場合にのみ、解析が成功したと見なされます。一致する解析パターンがない場合は、ParseException がスローされます。

パーサーは、解析された日付に対して寛大です。

于 2013-10-21T17:26:46.200 に答える