Получить данные о дате (день, месяц, год) в GWT

Мне нужно получить данные дня, месяца, года из значения Date, но getYear() устарел, дает год на 2 цифры и имеет проблемы с Y2K (2008 дает 108). В java-документе рекомендуется использовать java.util.calendar, но он не поддерживается в GWT.

Я хочу избежать отправки всей информации между сервером и клиентом только для того, чтобы иметь дело с датами.

Изменить: Calendar может поддерживаться Функции обработки даты должны быть реализованы в версиях Futur GWT: http://code.google.com/p/google-web-toolkit/issues/detail?id=603

Ответ 1

Не используйте эти устаревшие методы в классе Date в GWT.

Если вы не хотите использовать сторонние реализации Date для GWT, вы используете комбинацию 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]

Edit- Аналогично, избегайте использования новой даты (yy, mm, dd), которая возникает в зависимости от браузера и диапазона дат.

Я использую простой класс DateUtil для создания и анализа объектов Date в 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;
    }
}

Ответ 2

Обходной путь, представленный Ашвином, работает, и это не так сложно. Но я бы предложил использовать шаблоны дат вместо разделения:

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

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

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

Ответ 3

Вы можете добавить 1900 к getYear() возвращаемому значению

Ответ 4

Я не думаю, что gwt будет поддерживать календарь в будущем, возможно, это может поддержать другую реализацию манипуляции с датами. Итак, поскольку рекомендация Java о том, что вы не используете Date, недействительна в Gwt, и у вас нет другой опции без импорта библиотеки сторонних разработчиков, правильным способом является использование Date и игнорирование предупреждений об отказе.