You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Veit Guna <ve...@gmx.de> on 2006/01/14 15:20:34 UTC

convertDateTime year digits

Hi.

I'm using Myfaces 1.1.1 with the Tomahawk extension. Now I would like to
 let the user enter his birthdate in the format dd.MM.yyyy (german
format). I use this on my page:

--cut here--
...
...
...

<t:inputCalendar id="birthdate" value="#{registrationPerson.birthdate}"
required="true" renderAsPopup="true" renderPopupButtonAsImage="true"
popupTodayString="#{msg.calendar_popup_today_label}"
popupWeekString="#{msg.calendar_popup_week_label}"
popupGotoString="#{msg.calendar_popup_actual_month_label}"
popupDateFormat="dd.MM.yyyy">
            		
<f:convertDateTime pattern="dd.MM.yyyy" type="date" />           		
            		
</t:inputCalendar>
...
...
...
--cut here--

Entering in the format 01.01.1976 works ok. Also the popup uses this
format. But when entering 01.01.76, it is interpreted (and redisplayed
when validation errors occur on this page) as 01.01.0076. Is this by
design or a bug? So is it possible, to let the user enter either 76 or
1976 an display and interpret it as 1976? Or do I have to implement this
in a custom converter (perhaps extending the "normal" one)?

I know, entering 01.01.10 could mean 2010 OR 1910 in this particular
(birthdate) case - but one could pass the marginal value as parameter to
the converter (<10 means 2000, >10 means 1900).

regards,
Veit

Re: convertDateTime year digits

Posted by Veit Guna <ve...@gmx.de>.
Hi.

It's a "problem" of the DateTimeConverter. I patched the original one
and I'm using it as a custom converter now, that overrides the old one.
Dates can be _entered_ as 2- or 4-digits years but it will be _printed_
according to the pattern. Here is the patch I'm using currently. Some
hack, but works for me. Perhaps someone finds it useful, too.


--cut here--
Index:
myfaces-current/api/api/src/main/java/javax/faces/convert/DateTimeConverter.java
===================================================================
---
myfaces-current/api/api/src/main/java/javax/faces/convert/DateTimeConverter.java
(revision 369026)
+++
myfaces-current/api/api/src/main/java/javax/faces/convert/DateTimeConverter.java
(working copy)
@@ -21,6 +21,8 @@
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.Locale;
 import java.util.TimeZone;

@@ -79,7 +81,46 @@
                     format.setTimeZone( tz );
                 try
                 {
-                    return format.parse(value);
+                	// format as usual
+                	Date lDate = format.parse(value);
+                	
+                	// if a 2-digit year was entered in a 4-digit "pattern",
+                	// try to add century
+                	
+                	// check if it's 4-digit format:
+                	// is a pattern (=simpledateformat) or medium
(=dateformat) style used?                	
+                	if ( (_pattern != null && _pattern.indexOf("yyyy") >
-1) ||
+                		(getDateStyle().equals(STYLE_DEFAULT) ||
getDateStyle().equals(STYLE_MEDIUM)) ) {
+	                	
+                		// prepare calendar instance
+                		Calendar lCal = Calendar.getInstance();
+	                	lCal.setTime(lDate);
+	                	
+	                	// check if the year is 2-digit year, although
pattern is set to 4-digit
+	                	if (lCal.get(Calendar.YEAR) < 100) {
+	                	
+	                		// do the simpledateformat handling
+	                		if (_pattern != null) {               			
+	                			
+		                		// format it as a 2-digit year, which supports the
century mechanism
+		                		((SimpleDateFormat)
format).applyPattern(_pattern.replace("yyyy","yy"));	                		
+		                		lDate = format.parse(value);
+	                		} else {
+
+	                			// format it as a 2-digit year, which supports the
century mechanism
+		                		_dateStyle = STYLE_SHORT;
+		                		
+		                		format = getDateFormat();
+
+		                        if( tz != null )
+		                            format.setTimeZone( tz );
+		                		
+		                    	lDate = format.parse(value);	                			
+	                		}
+	                	}
+                	}
+                	
+                	return lDate;
                 }
                 catch (ParseException e)
                 {
-- cut here--

regards,
Veit



Martin Marinschek schrieb:
> But <f:convertDateTime>
> 
> just uses the standard Java-date functionality, so this should work.
> 
> What happens if you use a text-field, and apply a converter to this text-field?
> 
> regards,
> 
> Martin
> 
> On 1/14/06, Veit Guna <ve...@gmx.de> wrote:
>> Hi.
>>
>> I've updated all my faces libs to 1.1.2-SNAPSHOT. But the problem still
>> exists.
>> Some improvements were made to the inputCalendar component. 01.01.30
>> entered in the textfield will be correctly interpreted as 1930 by the
>> inputCalendar component when it popups. In the old release, it
>> interpreted it as the year 30.
>>
>> So, it seems convertDateTime still lacks the 01.01.30 -> 01.01.1930
>> support :(.
>>
>> regards,
>> Veit
>>
>>
>> Martin Marinschek schrieb:
>>> There have been many changes in the inputCalendar component since the
>>> 1.1.1 version - you'll need to update to a recent version for support
>>> of the inputCalendar... I do suppose that your issue is fixed already,
>>> though.
>>>
>>> regards,
>>>
>>> Martin
>>>
>>> On 1/14/06, Veit Guna <ve...@gmx.de> wrote:
>>>> Hi.
>>>>
>>>> I'm using Myfaces 1.1.1 with the Tomahawk extension. Now I would like to
>>>>  let the user enter his birthdate in the format dd.MM.yyyy (german
>>>> format). I use this on my page:
>>>>
>>>> --cut here--
>>>> ...
>>>> ...
>>>> ...
>>>>
>>>> <t:inputCalendar id="birthdate" value="#{registrationPerson.birthdate}"
>>>> required="true" renderAsPopup="true" renderPopupButtonAsImage="true"
>>>> popupTodayString="#{msg.calendar_popup_today_label}"
>>>> popupWeekString="#{msg.calendar_popup_week_label}"
>>>> popupGotoString="#{msg.calendar_popup_actual_month_label}"
>>>> popupDateFormat="dd.MM.yyyy">
>>>>
>>>> <f:convertDateTime pattern="dd.MM.yyyy" type="date" />
>>>>
>>>> </t:inputCalendar>
>>>> ...
>>>> ...
>>>> ...
>>>> --cut here--
>>>>
>>>> Entering in the format 01.01.1976 works ok. Also the popup uses this
>>>> format. But when entering 01.01.76, it is interpreted (and redisplayed
>>>> when validation errors occur on this page) as 01.01.0076. Is this by
>>>> design or a bug? So is it possible, to let the user enter either 76 or
>>>> 1976 an display and interpret it as 1976? Or do I have to implement this
>>>> in a custom converter (perhaps extending the "normal" one)?
>>>>
>>>> I know, entering 01.01.10 could mean 2010 OR 1910 in this particular
>>>> (birthdate) case - but one could pass the marginal value as parameter to
>>>> the converter (<10 means 2000, >10 means 1900).
>>>>
>>>> regards,
>>>> Veit
>>>>
>>
> 
> 
> --
> 
> http://www.irian.at
> 
> Your JSF powerhouse -
> JSF Consulting, Development and
> Courses in English and German
> 
> Professional Support for Apache MyFaces
> 
> 

Re: convertDateTime year digits

Posted by Veit Guna <ve...@gmx.de>.
I reduced it to:

<h:inputText id="birthdate" value="#{registrationPerson.birthdate}"
required="true" />

and 01.01.30 will be re-displayed to 01.01.0030 if validations of other
fields on the page fail.

So it is no convertDateTime specific problem?

I'm missing something?

Entering foobar is correctly intercepted by the default (?) converter
saying it's no correct date. The type is java.util.Date and null per
default.

regards,
Veit


Martin Marinschek schrieb:
> But <f:convertDateTime>
> 
> just uses the standard Java-date functionality, so this should work.
> 
> What happens if you use a text-field, and apply a converter to this text-field?
> 
> regards,
> 
> Martin
> 
> On 1/14/06, Veit Guna <ve...@gmx.de> wrote:
>> Hi.
>>
>> I've updated all my faces libs to 1.1.2-SNAPSHOT. But the problem still
>> exists.
>> Some improvements were made to the inputCalendar component. 01.01.30
>> entered in the textfield will be correctly interpreted as 1930 by the
>> inputCalendar component when it popups. In the old release, it
>> interpreted it as the year 30.
>>
>> So, it seems convertDateTime still lacks the 01.01.30 -> 01.01.1930
>> support :(.
>>
>> regards,
>> Veit
>>
>>
>> Martin Marinschek schrieb:
>>> There have been many changes in the inputCalendar component since the
>>> 1.1.1 version - you'll need to update to a recent version for support
>>> of the inputCalendar... I do suppose that your issue is fixed already,
>>> though.
>>>
>>> regards,
>>>
>>> Martin
>>>
>>> On 1/14/06, Veit Guna <ve...@gmx.de> wrote:
>>>> Hi.
>>>>
>>>> I'm using Myfaces 1.1.1 with the Tomahawk extension. Now I would like to
>>>>  let the user enter his birthdate in the format dd.MM.yyyy (german
>>>> format). I use this on my page:
>>>>
>>>> --cut here--
>>>> ...
>>>> ...
>>>> ...
>>>>
>>>> <t:inputCalendar id="birthdate" value="#{registrationPerson.birthdate}"
>>>> required="true" renderAsPopup="true" renderPopupButtonAsImage="true"
>>>> popupTodayString="#{msg.calendar_popup_today_label}"
>>>> popupWeekString="#{msg.calendar_popup_week_label}"
>>>> popupGotoString="#{msg.calendar_popup_actual_month_label}"
>>>> popupDateFormat="dd.MM.yyyy">
>>>>
>>>> <f:convertDateTime pattern="dd.MM.yyyy" type="date" />
>>>>
>>>> </t:inputCalendar>
>>>> ...
>>>> ...
>>>> ...
>>>> --cut here--
>>>>
>>>> Entering in the format 01.01.1976 works ok. Also the popup uses this
>>>> format. But when entering 01.01.76, it is interpreted (and redisplayed
>>>> when validation errors occur on this page) as 01.01.0076. Is this by
>>>> design or a bug? So is it possible, to let the user enter either 76 or
>>>> 1976 an display and interpret it as 1976? Or do I have to implement this
>>>> in a custom converter (perhaps extending the "normal" one)?
>>>>
>>>> I know, entering 01.01.10 could mean 2010 OR 1910 in this particular
>>>> (birthdate) case - but one could pass the marginal value as parameter to
>>>> the converter (<10 means 2000, >10 means 1900).
>>>>
>>>> regards,
>>>> Veit
>>>>
>>
> 
> 
> --
> 
> http://www.irian.at
> 
> Your JSF powerhouse -
> JSF Consulting, Development and
> Courses in English and German
> 
> Professional Support for Apache MyFaces
> 
> 

Re: convertDateTime year digits

Posted by Martin Marinschek <ma...@gmail.com>.
But <f:convertDateTime>

just uses the standard Java-date functionality, so this should work.

What happens if you use a text-field, and apply a converter to this text-field?

regards,

Martin

On 1/14/06, Veit Guna <ve...@gmx.de> wrote:
> Hi.
>
> I've updated all my faces libs to 1.1.2-SNAPSHOT. But the problem still
> exists.
> Some improvements were made to the inputCalendar component. 01.01.30
> entered in the textfield will be correctly interpreted as 1930 by the
> inputCalendar component when it popups. In the old release, it
> interpreted it as the year 30.
>
> So, it seems convertDateTime still lacks the 01.01.30 -> 01.01.1930
> support :(.
>
> regards,
> Veit
>
>
> Martin Marinschek schrieb:
> > There have been many changes in the inputCalendar component since the
> > 1.1.1 version - you'll need to update to a recent version for support
> > of the inputCalendar... I do suppose that your issue is fixed already,
> > though.
> >
> > regards,
> >
> > Martin
> >
> > On 1/14/06, Veit Guna <ve...@gmx.de> wrote:
> >> Hi.
> >>
> >> I'm using Myfaces 1.1.1 with the Tomahawk extension. Now I would like to
> >>  let the user enter his birthdate in the format dd.MM.yyyy (german
> >> format). I use this on my page:
> >>
> >> --cut here--
> >> ...
> >> ...
> >> ...
> >>
> >> <t:inputCalendar id="birthdate" value="#{registrationPerson.birthdate}"
> >> required="true" renderAsPopup="true" renderPopupButtonAsImage="true"
> >> popupTodayString="#{msg.calendar_popup_today_label}"
> >> popupWeekString="#{msg.calendar_popup_week_label}"
> >> popupGotoString="#{msg.calendar_popup_actual_month_label}"
> >> popupDateFormat="dd.MM.yyyy">
> >>
> >> <f:convertDateTime pattern="dd.MM.yyyy" type="date" />
> >>
> >> </t:inputCalendar>
> >> ...
> >> ...
> >> ...
> >> --cut here--
> >>
> >> Entering in the format 01.01.1976 works ok. Also the popup uses this
> >> format. But when entering 01.01.76, it is interpreted (and redisplayed
> >> when validation errors occur on this page) as 01.01.0076. Is this by
> >> design or a bug? So is it possible, to let the user enter either 76 or
> >> 1976 an display and interpret it as 1976? Or do I have to implement this
> >> in a custom converter (perhaps extending the "normal" one)?
> >>
> >> I know, entering 01.01.10 could mean 2010 OR 1910 in this particular
> >> (birthdate) case - but one could pass the marginal value as parameter to
> >> the converter (<10 means 2000, >10 means 1900).
> >>
> >> regards,
> >> Veit
> >>
>
>


--

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces

Re: convertDateTime year digits

Posted by Veit Guna <ve...@gmx.de>.
Hi.

I've updated all my faces libs to 1.1.2-SNAPSHOT. But the problem still
exists.
Some improvements were made to the inputCalendar component. 01.01.30
entered in the textfield will be correctly interpreted as 1930 by the
inputCalendar component when it popups. In the old release, it
interpreted it as the year 30.

So, it seems convertDateTime still lacks the 01.01.30 -> 01.01.1930
support :(.

regards,
Veit


Martin Marinschek schrieb:
> There have been many changes in the inputCalendar component since the
> 1.1.1 version - you'll need to update to a recent version for support
> of the inputCalendar... I do suppose that your issue is fixed already,
> though.
> 
> regards,
> 
> Martin
> 
> On 1/14/06, Veit Guna <ve...@gmx.de> wrote:
>> Hi.
>>
>> I'm using Myfaces 1.1.1 with the Tomahawk extension. Now I would like to
>>  let the user enter his birthdate in the format dd.MM.yyyy (german
>> format). I use this on my page:
>>
>> --cut here--
>> ...
>> ...
>> ...
>>
>> <t:inputCalendar id="birthdate" value="#{registrationPerson.birthdate}"
>> required="true" renderAsPopup="true" renderPopupButtonAsImage="true"
>> popupTodayString="#{msg.calendar_popup_today_label}"
>> popupWeekString="#{msg.calendar_popup_week_label}"
>> popupGotoString="#{msg.calendar_popup_actual_month_label}"
>> popupDateFormat="dd.MM.yyyy">
>>
>> <f:convertDateTime pattern="dd.MM.yyyy" type="date" />
>>
>> </t:inputCalendar>
>> ...
>> ...
>> ...
>> --cut here--
>>
>> Entering in the format 01.01.1976 works ok. Also the popup uses this
>> format. But when entering 01.01.76, it is interpreted (and redisplayed
>> when validation errors occur on this page) as 01.01.0076. Is this by
>> design or a bug? So is it possible, to let the user enter either 76 or
>> 1976 an display and interpret it as 1976? Or do I have to implement this
>> in a custom converter (perhaps extending the "normal" one)?
>>
>> I know, entering 01.01.10 could mean 2010 OR 1910 in this particular
>> (birthdate) case - but one could pass the marginal value as parameter to
>> the converter (<10 means 2000, >10 means 1900).
>>
>> regards,
>> Veit
>>


Re: convertDateTime year digits

Posted by Martin Marinschek <ma...@gmail.com>.
There have been many changes in the inputCalendar component since the
1.1.1 version - you'll need to update to a recent version for support
of the inputCalendar... I do suppose that your issue is fixed already,
though.

regards,

Martin

On 1/14/06, Veit Guna <ve...@gmx.de> wrote:
> Hi.
>
> I'm using Myfaces 1.1.1 with the Tomahawk extension. Now I would like to
>  let the user enter his birthdate in the format dd.MM.yyyy (german
> format). I use this on my page:
>
> --cut here--
> ...
> ...
> ...
>
> <t:inputCalendar id="birthdate" value="#{registrationPerson.birthdate}"
> required="true" renderAsPopup="true" renderPopupButtonAsImage="true"
> popupTodayString="#{msg.calendar_popup_today_label}"
> popupWeekString="#{msg.calendar_popup_week_label}"
> popupGotoString="#{msg.calendar_popup_actual_month_label}"
> popupDateFormat="dd.MM.yyyy">
>
> <f:convertDateTime pattern="dd.MM.yyyy" type="date" />
>
> </t:inputCalendar>
> ...
> ...
> ...
> --cut here--
>
> Entering in the format 01.01.1976 works ok. Also the popup uses this
> format. But when entering 01.01.76, it is interpreted (and redisplayed
> when validation errors occur on this page) as 01.01.0076. Is this by
> design or a bug? So is it possible, to let the user enter either 76 or
> 1976 an display and interpret it as 1976? Or do I have to implement this
> in a custom converter (perhaps extending the "normal" one)?
>
> I know, entering 01.01.10 could mean 2010 OR 1910 in this particular
> (birthdate) case - but one could pass the marginal value as parameter to
> the converter (<10 means 2000, >10 means 1900).
>
> regards,
> Veit
>


--

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces