在 GWT 中获取日期细节(日、月、年)

17

我需要从一个Date值中获取日,月,年的细节信息,但是getYear()已被弃用,只会给出两位数的年份,并且在Y2K问题上存在问题(2008年给出108)。Java文档建议使用java.util.calendar,但在GWT中不受支持。

我想避免在服务器和客户端之间来回发送所有信息以处理日期。

编辑:Calendar可能得到支持 在GWT未来版本中应该实现日期处理函数http://code.google.com/p/google-web-toolkit/issues/detail?id=603

4个回答

26

Ashwin提出的解决方法可行而且并不复杂。但是我建议使用日期模式而不是拆分字符串:

For date - 
DateTimeFormat.getFormat( "d" ).format( new Date() )

For month - 
DateTimeFormat.getFormat( "M" ).format( new Date() )

For year - 
DateTimeFormat.getFormat( "yyyy" ).format( new Date() )

18

不要在GWT中使用那些已弃用的Date类方法。

如果你不想使用第三方的Date实现库,可以通过DateTimeFormat和字符串操作的组合来作为一个暂时的解决办法,直到GWT提供更好的日期处理支持。

For date - 
DateTimeFormat.getFormat( "d-M-yyyy" ).format( new Date() ).split( "-")[0]

For month - 
DateTimeFormat.getFormat( "d-M-yyyy" ).format( new Date() ).split( "-")[1]

For year - 
DateTimeFormat.getFormat( "d-M-yyyy" ).format( new Date() ).split( "-")[2]

编辑 - 同样,避免使用new Date(yy,mm,dd),因为这取决于浏览器和日期范围而存在不一致性。

我使用了一个简单的DateUtil类来创建和解析GWT中的日期对象,也许对你有用 -

(警告:非常粗糙且仍在改进中)

public class DateUtil
{
    private static final String D_M_YYYY = "d-M-yyyy";
    private static final String DATE_SEPARATOR = "-";

    public static Date getDate( Integer dd, Integer mm, Integer yyyy )
    {
        if ( dd == null || mm == null || yyyy == null )
            return null;

        Date retVal = null;
        try
        {
            retVal = DateTimeFormat.getFormat( D_M_YYYY ).parse( dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + yyyy );
        }
        catch ( Exception e )
        {
            retVal = null;
        }

        return retVal;
    }

    public static String getDayAsString( Date date )
    {
        return ( date == null ) ? null : DateTimeFormat.getFormat( D_M_YYYY ).format( date ).split( DATE_SEPARATOR )[0];
    }

    public static String getMonthAsString( Date date )
    {
        return ( date == null ) ? null : DateTimeFormat.getFormat( D_M_YYYY ).format( date ).split( DATE_SEPARATOR )[1];
    }

    public static String getYearAsString( Date date )
    {
        return ( date == null ) ? null : DateTimeFormat.getFormat( D_M_YYYY ).format( date ).split( DATE_SEPARATOR )[2];
    }

    public static boolean isValidDate( Integer dd, Integer mm, Integer yyyy )
    {
        boolean isvalidDate = true;

        try
        {
            String transformedInput = DateTimeFormat.getFormat( D_M_YYYY ).format( getDate( dd, mm, yyyy ) );
            String originalInput = dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + yyyy;

            isvalidDate = transformedInput.equals( originalInput );
        }
        catch ( Exception e )
        {
            isvalidDate = false;
        }

        return isvalidDate;
    }
}

你会推荐哪些第三方日期实现库? - Jla
我的应用程序中没有复杂的日期算术运算,因此我并没有认真寻找任何适用于GWT的DateTime库。 我知道有一个GwtDateTime实用程序(http://code.google.com/p/gwt-examples/wiki/gwtDateTime),但由于没有测试过,无法为其背书。你的经验可能会有所不同。 - Ashwin Prabhu
这些在单元测试中不起作用 :( (除非您扩展速度较慢的GWTTestCase) - Ben Noland
2
不要在GWT的Date类中使用那些已弃用的方法,我曾经见过一些客户端行为不一致的情况。真的吗?你能举个例子吗?DateTimeFormat的后台实现广泛使用了这些已弃用的方法::http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java?r=10061 - funkybro
我在我的GWT客户端代码中使用了那些已弃用的函数。当Calendar出现时,它们就被Java弃用了。我认为在GWT客户端中使用它们没有任何问题。我认为BlaXpirit下面分享的正确解决方案是调用getYear()并加上1900。已点赞。 - broc.seib

2

您只需将 getYear() 返回值加上 1900 即可。


1

我认为GWT将来不会支持日历,但可能会支持其他日期操作实现。因此,由于Java建议不使用Date在GWT中无效,并且您没有其他选择而不导入第三方库,正确的方法是使用Date并忽略弃用警告。


在 Date 的弃用 getter 中有一些边缘情况会失败。我花了几个小时才找到错误源头,是由于日期上的 getDate() 方法,自那以后就停止使用 Date 方法。我强烈建议您在部署到生产环境之前彻底测试您的日期方法,以确保符合预期的日期范围。 - Ashwin Prabhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接