20

クライアントとサーバーの両方で同じように機能する必要がある関数があり、日付をフォーマットします。

if (GWT.isClient())
{
  // Use DateTimeFormat
} else {
  // Use SimpleDateFormat
}

GWTの文句:SimpleDateFormatタイプのソースコードはありません。エラーは致命的ではありませんが(少なくとも開発モードでは)、迷惑であり、それを抑制する方法はありません。http://groups.google.com/group/google-web-toolkit/browse_thread/thread/981247fca161c287で同様の質問が見つかりました。そこで彼らは提案します:

SimpleDateTimeFormatのダミーのスーパーソース実装を提供して、コンパイルできるようにすることができます。

私は試した。今Eclipseは文句を言う:

java.text宣言されたパッケージ"java.text"が、予期されたパッケージ"foo.jre.java.text"SimpleDateFormat.javaと一致しません

4

5 に答える 5

31

com.google.gwt.i18n.shared.DateTimeFormatサーバーとクライアントの両方で使用できます。

保護されたコンストラクターを呼び出して、GWT.createを回避します

String pattern = "yyyyMMdd"; /*your pattern here*/ 
DefaultDateTimeFormatInfo info = new DefaultDateTimeFormatInfo();
DateTimeFormat dtf = new DateTimeFormat(pattern, info) {};  // <= trick here

Date d = dtf.parse("20120301");
CalendarUtil.addDaysToDate(d, -1);
String s = dtf.format(d);
// s now contains "20120229"

トリックは、の呼び出しを回避するために使用する場所でDateTimeFormat保護されたコンストラクターを使用できるように拡張することによって行われます。DateTimeFormatInfonew DefaultDateTimeFormatInfo()GWT.create

于 2013-05-23T11:25:20.153 に答える
2

このソリューションは少し異なりますが、@ ochakovが提示したものと同じパスにありますが、GWT2.7の問題@stepanchegを解決します。

import java.util.Date;

import com.google.gwt.core.client.GWT;
import com.google.gwt.thirdparty.guava.common.annotations.GwtCompatible;
import com.google.gwt.thirdparty.guava.common.annotations.GwtIncompatible;

public abstract class DateTimeFormat {
    static DateTimeFormat getFormat(String pattern)
    {
        if (GWT.isClient())
            return new DateTimeFormatClient(pattern);
        else
            return new DateTimeFormatServer(pattern);
    }

    public abstract String format(Date date);

    public abstract Date parse(String dateString);

    @GwtCompatible
    private static class DateTimeFormatClient extends DateTimeFormat
    {
        protected String pattern;

        public DateTimeFormatClient(String pattern)
        {
            this.pattern = pattern;
        }


        public String format(Date date)
        {
            return com.google.gwt.i18n.client.DateTimeFormat.getFormat(pattern).format(date);
        }

        public Date parse(String stringDate){
            return com.google.gwt.i18n.client.DateTimeFormat.getFormat(pattern).parseStrict(stringDate);
        }
    }

    private static class DateTimeFormatServer extends DateTimeFormatClient
    {

        public DateTimeFormatServer(String pattern)
        {
            super(pattern);
        }


        @GwtIncompatible("Server format")
        public String format(Date date)
        {
            return (new java.text.SimpleDateFormat(pattern)).format(date);
        }  

        @GwtIncompatible("Server parse")
        public Date parse(String dateString){
            try{
                return (new java.text.SimpleDateFormat(pattern)).parse(dateString);
            }catch(Exception ex){
            throw new IllegalArgumentException("Cannot convert to date: "+ dateString);
            }
        }

    }
}

これが他の人に役立つことを願っています。

于 2015-09-01T16:41:22.887 に答える
2
import com.google.gwt.i18n.shared.DateTimeFormat;
DateTimeFormat fm = DateTimeFormat.getFormat("MM/dd");
String st = fm.format(date);
于 2016-07-27T03:31:10.440 に答える
0

スーパーソースのJavaファイルをコンパイルしないようにEclipseに指示する必要があります。Mavenを使用している場合は、それをsrc / main/resourcesに移動するだけです。それ以外の場合は、 Eclipseのビルドパスから「jre」パッケージを除外します。

...そうは言っても、SimpleDateFormat / DateTimeFormatを使用するクラスをスーパーソース化するか、スーパーソース化するヘルパークラスに移動したいと思います。

于 2012-04-23T19:08:11.183 に答える
0
import java.util.Date;

import com.google.gwt.core.shared.GWT;
import com.google.gwt.thirdparty.guava.common.annotations.GwtCompatible;
import com.google.gwt.thirdparty.guava.common.annotations.GwtIncompatible;

public abstract class DateTimeFormat
{
    static DateTimeFormat getFormat(String pattern)
    {
        if (GWT.isClient())
            return DateTimeFormatClient.getFormat(pattern);
        else
            return DateTimeFormatServer.getFormat(pattern);
    }

    public abstract String format(Date date);

    @GwtCompatible
    private static class DateTimeFormatClient extends DateTimeFormat
    {
        private com.google.gwt.i18n.client.DateTimeFormat dateTimeFormat;

        protected DateTimeFormatClient(String pattern)
        {
            this.dateTimeFormat = com.google.gwt.i18n.client.DateTimeFormat.getFormat(pattern);
        }

        public static DateTimeFormat getFormat(String pattern)
        {
            return new DateTimeFormatClient(pattern);
        }

        public String format(Date date)
        {
            return dateTimeFormat.format(date);
        }
    }

    @GwtIncompatible("Server version of the class")
    private static class DateTimeFormatServer extends DateTimeFormat
    {
        private java.text.SimpleDateFormat dateTimeFormat;

        protected DateTimeFormatServer(String pattern)
        {
            this.dateTimeFormat = new java.text.SimpleDateFormat(pattern);
        }

        public static DateTimeFormat getFormat(String pattern)
        {
            return new DateTimeFormatServer(pattern);
        }

        public String format(Date date)
        {
            return dateTimeFormat.format(date);
        }       

    }
}
于 2013-05-13T21:13:31.077 に答える