クライアントとサーバーの両方で同じように機能する必要がある関数があり、日付をフォーマットします。
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と一致しません
スーパーソースのd JavaファイルをコンパイルしないようにEclipseに指示する必要があります。Mavenを使用している場合は、単にsrc/main/resourcesに移動するだけです。それ以外の場合は、除外します。 your'jre 'package Eclipseのビルドパスから。
...そうは言っても、SimpleDateFormat/DateTimeFormatを使用するクラスをスーパーソース化するか、スーパーソース化するヘルパークラスに移動したいと思います。
サーバーとクライアントの両方で_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
_の呼び出しを回避します。
このソリューションは少し異なりますが、@ 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);
}
}
}
}
これが他の人を助けることを願っています。
import com.google.gwt.i18n.shared.DateTimeFormat;
DateTimeFormat fm = DateTimeFormat.getFormat("MM/dd");
String st = fm.format(date);
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);
}
}
}