web-dev-qa-db-ja.com

GWT:クライアントでDateTimeFormatを使用し、サーバーでSimpleDateFormatを使用します

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

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と一致しません

18
basin

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

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

0
Thomas Broyer

サーバーとクライアントの両方で_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を拡張することで実行されるため、DateTimeFormatInfoで保護されたコンストラクターを使用できます。ここで、new DefaultDateTimeFormatInfo()を使用して、_GWT.create_の呼び出しを回避します。

29
Michal Moravcik

このソリューションは少し異なりますが、@ 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);
            }
        }

    }
}

これが他の人を助けることを願っています。

1
Daniel Ardison
import com.google.gwt.i18n.shared.DateTimeFormat;
DateTimeFormat fm = DateTimeFormat.getFormat("MM/dd");
String st = fm.format(date);
1
Khanh Tran
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);
        }       

    }
}
0
ochakov