[Zope-dev] Zope 2 PropertyManager: editing date properties
yuppie
y.2011 at wcm-solutions.de
Wed Mar 9 04:53:58 EST 2011
Hi!
AFAICS editing date properties is broken. But before I check in a fix,
I'd like to make sure the current behavior is not a feature.
The dual nature of DateTime objects marked as timezoneNaive is hard to
grasp: They are offset-naive *and* have a time zone. Only one of both
aspects can be respected in a specific situation. And there might be
different opinions which aspect is more important on the 'Properties'
tab of PropertyManager objects.
BTW: I think it was a mistake to add a timezoneNaive flag instead of
setting the timezone value of offset-naive DateTime objects to None.
This is the issue in the 'Properties' tab:
------------------------------------------
If you set a date property to '2011/03/09 11:00:00' and the machines
time zone is 'GMT+1', this kind of DateTime object is created:
>>> dt = DateTime('2011/03/09 11:00:00')
>>> dt.timezoneNaive()
True
>>> dt.timezone()
'GMT+1'
>>> dt.asdatetime()
datetime.datetime(2011, 3, 9, 11, 0)
After saving this DateTime object, '2011/03/09 11:00:00 GMT+1' is shown
on the 'Properties' tab. Note that our input didn't include a time zone
and the persistent object is marked as offset-naive. That's caused by
the __str__ method of DateTime:
>>> str(dt)
'2011/03/09 11:00:00 GMT+1'
If you don't touch that setting and save the form again, this kind of
DateTime object is created:
>>> dt = DateTime('2011/03/09 11:00:00 GMT+1')
>>> dt.timezoneNaive()
False
>>> dt.timezone()
'GMT+1'
>>> dt.asdatetime()
datetime.datetime(2011, 3, 9, 11, 0, tzinfo=<StaticTzInfo 'GMT+1'>)
If I set a date property to '2011/03/09 11:00:00', I expect it stays
marked as offset-naive if I save it twice. So I think the 'Properties'
tab should show '2011/03/09 11:00:00' without time zone if the object is
marked as offset-naive.
But maybe other people expect the time zone doesn't change and don't
care about naive or not. This creates a naive DateTime object with a
different time zone:
>>> dt = DateTime('2011-03-09 11:00:00')
>>> dt.timezoneNaive()
True
>>> dt.timezone()
'GMT+0'
Currently the time zone is preserved, but not the naive marker:
>>> dt = DateTime('2011/03/09 11:00:00 GMT+0')
>>> dt.timezoneNaive()
False
>>> dt.timezone()
'GMT+0'
With the fix I propose the naive marker is preserved, but not the time zone:
>>> dt = DateTime('2011/03/09 11:00:00')
>>> dt.timezoneNaive()
True
>>> dt.timezone()
'GMT+1'
I would argue the people who don't care about naive or not should set
the time zone explicitly. In that case the DateTime objects are always
marked as offset-aware and the proposed fix will not affect them.
Any opinions?
Cheers,
Yuppie
More information about the Zope-Dev
mailing list