dateformat.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. from datetime import datetime, date
  2. import os
  3. import time
  4. from django.utils.dateformat import format
  5. from django.utils import dateformat, translation, unittest
  6. from django.utils.timezone import utc
  7. from django.utils.tzinfo import FixedOffset, LocalTimezone
  8. class DateFormatTests(unittest.TestCase):
  9. def setUp(self):
  10. self.old_TZ = os.environ.get('TZ')
  11. os.environ['TZ'] = 'Europe/Copenhagen'
  12. translation.activate('en-us')
  13. try:
  14. # Check if a timezone has been set
  15. time.tzset()
  16. self.tz_tests = True
  17. except AttributeError:
  18. # No timezone available. Don't run the tests that require a TZ
  19. self.tz_tests = False
  20. def tearDown(self):
  21. if self.old_TZ is None:
  22. del os.environ['TZ']
  23. else:
  24. os.environ['TZ'] = self.old_TZ
  25. # Cleanup - force re-evaluation of TZ environment variable.
  26. if self.tz_tests:
  27. time.tzset()
  28. def test_date(self):
  29. d = date(2009, 5, 16)
  30. self.assertEqual(date.fromtimestamp(int(format(d, 'U'))), d)
  31. def test_naive_datetime(self):
  32. dt = datetime(2009, 5, 16, 5, 30, 30)
  33. self.assertEqual(datetime.fromtimestamp(int(format(dt, 'U'))), dt)
  34. def test_datetime_with_local_tzinfo(self):
  35. ltz = LocalTimezone(datetime.now())
  36. dt = datetime(2009, 5, 16, 5, 30, 30, tzinfo=ltz)
  37. self.assertEqual(datetime.fromtimestamp(int(format(dt, 'U')), ltz), dt)
  38. self.assertEqual(datetime.fromtimestamp(int(format(dt, 'U'))), dt.replace(tzinfo=None))
  39. def test_datetime_with_tzinfo(self):
  40. tz = FixedOffset(-510)
  41. ltz = LocalTimezone(datetime.now())
  42. dt = datetime(2009, 5, 16, 5, 30, 30, tzinfo=tz)
  43. self.assertEqual(datetime.fromtimestamp(int(format(dt, 'U')), tz), dt)
  44. self.assertEqual(datetime.fromtimestamp(int(format(dt, 'U')), ltz), dt)
  45. self.assertEqual(datetime.fromtimestamp(int(format(dt, 'U'))), dt.astimezone(ltz).replace(tzinfo=None))
  46. self.assertEqual(datetime.fromtimestamp(int(format(dt, 'U')), tz).utctimetuple(), dt.utctimetuple())
  47. self.assertEqual(datetime.fromtimestamp(int(format(dt, 'U')), ltz).utctimetuple(), dt.utctimetuple())
  48. def test_epoch(self):
  49. udt = datetime(1970, 1, 1, tzinfo=utc)
  50. self.assertEqual(format(udt, 'U'), u'0')
  51. def test_empty_format(self):
  52. my_birthday = datetime(1979, 7, 8, 22, 00)
  53. self.assertEqual(dateformat.format(my_birthday, ''), u'')
  54. def test_am_pm(self):
  55. my_birthday = datetime(1979, 7, 8, 22, 00)
  56. self.assertEqual(dateformat.format(my_birthday, 'a'), u'p.m.')
  57. def test_date_formats(self):
  58. my_birthday = datetime(1979, 7, 8, 22, 00)
  59. timestamp = datetime(2008, 5, 19, 11, 45, 23, 123456)
  60. self.assertEqual(dateformat.format(my_birthday, 'A'), u'PM')
  61. self.assertEqual(dateformat.format(timestamp, 'c'), u'2008-05-19T11:45:23.123456')
  62. self.assertEqual(dateformat.format(my_birthday, 'd'), u'08')
  63. self.assertEqual(dateformat.format(my_birthday, 'j'), u'8')
  64. self.assertEqual(dateformat.format(my_birthday, 'l'), u'Sunday')
  65. self.assertEqual(dateformat.format(my_birthday, 'L'), u'False')
  66. self.assertEqual(dateformat.format(my_birthday, 'm'), u'07')
  67. self.assertEqual(dateformat.format(my_birthday, 'M'), u'Jul')
  68. self.assertEqual(dateformat.format(my_birthday, 'b'), u'jul')
  69. self.assertEqual(dateformat.format(my_birthday, 'n'), u'7')
  70. self.assertEqual(dateformat.format(my_birthday, 'N'), u'July')
  71. def test_time_formats(self):
  72. my_birthday = datetime(1979, 7, 8, 22, 00)
  73. self.assertEqual(dateformat.format(my_birthday, 'P'), u'10 p.m.')
  74. self.assertEqual(dateformat.format(my_birthday, 's'), u'00')
  75. self.assertEqual(dateformat.format(my_birthday, 'S'), u'th')
  76. self.assertEqual(dateformat.format(my_birthday, 't'), u'31')
  77. self.assertEqual(dateformat.format(my_birthday, 'w'), u'0')
  78. self.assertEqual(dateformat.format(my_birthday, 'W'), u'27')
  79. self.assertEqual(dateformat.format(my_birthday, 'y'), u'79')
  80. self.assertEqual(dateformat.format(my_birthday, 'Y'), u'1979')
  81. self.assertEqual(dateformat.format(my_birthday, 'z'), u'189')
  82. def test_dateformat(self):
  83. my_birthday = datetime(1979, 7, 8, 22, 00)
  84. self.assertEqual(dateformat.format(my_birthday, r'Y z \C\E\T'), u'1979 189 CET')
  85. self.assertEqual(dateformat.format(my_birthday, r'jS o\f F'), u'8th of July')
  86. def test_futuredates(self):
  87. the_future = datetime(2100, 10, 25, 0, 00)
  88. self.assertEqual(dateformat.format(the_future, r'Y'), u'2100')
  89. def test_timezones(self):
  90. my_birthday = datetime(1979, 7, 8, 22, 00)
  91. summertime = datetime(2005, 10, 30, 1, 00)
  92. wintertime = datetime(2005, 10, 30, 4, 00)
  93. timestamp = datetime(2008, 5, 19, 11, 45, 23, 123456)
  94. if self.tz_tests:
  95. self.assertEqual(dateformat.format(my_birthday, 'O'), u'+0100')
  96. self.assertEqual(dateformat.format(my_birthday, 'r'), u'Sun, 8 Jul 1979 22:00:00 +0100')
  97. self.assertEqual(dateformat.format(my_birthday, 'T'), u'CET')
  98. self.assertEqual(dateformat.format(my_birthday, 'U'), u'300315600')
  99. self.assertEqual(dateformat.format(timestamp, 'u'), u'123456')
  100. self.assertEqual(dateformat.format(my_birthday, 'Z'), u'3600')
  101. self.assertEqual(dateformat.format(summertime, 'I'), u'1')
  102. self.assertEqual(dateformat.format(summertime, 'O'), u'+0200')
  103. self.assertEqual(dateformat.format(wintertime, 'I'), u'0')
  104. self.assertEqual(dateformat.format(wintertime, 'O'), u'+0100')
  105. # Ticket #16924 -- We don't need timezone support to test this
  106. # 3h30m to the west of UTC
  107. tz = FixedOffset(-3*60 - 30)
  108. dt = datetime(2009, 5, 16, 5, 30, 30, tzinfo=tz)
  109. self.assertEqual(dateformat.format(dt, 'O'), u'-0330')