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因此我们可以DateTimeFormatInfo在使用的地方使用受保护的构造函数new DefaultDateTimeFormatInfo()来避免调用GWT.create

于 2013-05-23T11:25:20.153 回答
2

这个解决方案有点不同,但与@ochakov 提出的路径相同,但它解决了@stepancheg 和我提到的 GWT 2.7 问题。

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

您必须告诉 Eclipse 不要编译您的超级源 Java 文件。如果您使用的是 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 回答