Difference in datetime with timezone

133 views
Skip to first unread message

Andrés Alvarez

unread,
Mar 28, 2022, 3:15:01 PM3/28/22
to Django users
I need to save some fields in my database in the format YYY-MM-MM 00:00:00+00. So I decide to do this:
field_to_save = datetime.combine(date_to_save, time.min, pytz.timezone(TIME_ZONE))
in settings.py I have:
TIME_ZONE = 'America/Mexico_City'
USE_I18N = True
USE_L10N = True
USE_TZ = True

My model:
class Program(models.Model):
    objects = models.Manager()
    objects_custom = ProgramManager()
    class Meta:
        ordering = ['id']
    # ... others fields
    start_at = models.DateTimeField(null=True)
    finish_at = models.DateTimeField(null=True)

Here are my values to create the register:
OrderedDict([('has_individual_budget', False), ('name', 'plan test create program start_at datetime'), ('program_budget', '0'), ('uuid4', 'd6effacf-3c19-48db-ab06-5af1d97df599'), ('country_list', '[{"id":239,"name":"Venezuela","iso_code2":"VE","iso_code3":"VEN","phone_prefix":58,"currency":"VEF","flag":"U+1F1FB U+1F1EA","phone_national_regex":"^[68]00\\\\d{7}|(?:[24]\\\\d|[59]0)\\\\d{8}$","active":1}]'), ('method_payment', '7fb39a7e-a6de-488b-9564-9bd853b598ec'), ('currency', 'USD'), ('is_saved', False), ('start_at', datetime.datetime(2022, 3, 28, 0, 0, tzinfo=<DstTzInfo 'America/Mexico_City' LMT-1 day, 17:23:00 STD>)), ('finish_at', datetime.datetime(2022, 4, 27, 23, 59, 59, 999999, tzinfo=<DstTzInfo 'America/Mexico_City' LMT-1 day, 17:23:00 STD>)), ('company', <Company: Company object (247)>), ('card_provider', <CardProvider: stripe-usa>), ('payment_provider', <CardProvider: stripe-usa>)])
as you can see the field 'start_at' is the datetime that I want to store in the database, but when I look the insert query:
{'sql': 'INSERT INTO "user_program" ("name", "program_budget", "company_id", "active", "uuid4", "country_list", "method_payment", "currency", "create_at", "discharge_program", "updated_at", "deleted_at", "is_saved", "is_suspended", "start_at", "finish_at", "has_individual_budget", "card_provider_id", "payment_provider_id") VALUES (\'plan test create program start_at datetime\', \'0\', 247, true, \'d6effacf-3c19-48db-ab06-5af1d97df599\', \'[{"id":239,"name":"Venezuela","iso_code2":"VE","iso_code3":"VEN","phone_prefix":58,"currency":"VEF","flag":"U+1F1FB U+1F1EA","phone_national_regex":"^[68]00\\\\d{7}|(?:[24]\\\\d|[59]0)\\\\d{8}$","active":1}]\', \'7fb39a7e-a6de-488b-9564-9bd853b598ec\', \'USD\', \'2022-03-28T18:47:10.865801+00:00\'::timestamptz, \'2022-03-28T18:47:10.865870+00:00\'::timestamptz, \'2022-03-28T18:47:10.865913+00:00\'::timestamptz, NULL, false, false, \'2022-03-28T00:00:00-06:37\'::timestamptz, \'2022-04-27T23:59:59.999999-06:37\'::timestamptz, false, 1, 1) RETURNING "user_program"."id"', 'time': '0.267'}
the timezone part is -06:37 should be only -06.
Plase tell me how to fix that, if I need to change the TIME_ZONE or something.

Regards, Andres.

Antonis Christofides

unread,
Mar 29, 2022, 1:41:42 AM3/29/22
to django...@googlegroups.com

Hello,

  1. Please copy your code exactly. Is it really "pytz.timezone(TIME_ZONE)"? Or is it "pytz.timezone(settings.TIME_ZONE)"? If it is the first one, please include the definition or importing of TIME_ZONE.
  2. Please pretty-print your dictionary. You can use pprint for that. If it doesn't work on OrderedDicts, convert it to a simple dictionary before pretty printing.
  3. Likewise, do something so that your SQL statement is more readable, such as manually inserting newlines and indents.

Regards,

Antonis

Antonis Christofides
+30-6979924665 (mobile)
--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/1999ec1e-9170-432e-adc0-71cab3dece6an%40googlegroups.com.

Andrés Alvarez

unread,
Mar 29, 2022, 10:51:38 AM3/29/22
to Django users
I need to save some fields in my database in the format YYY-MM-MM 00:00:00+00. So I decide to do this:

# setting.py
TIME_ZONE = 'America/Mexico_City'
USE_I18N = True
USE_L10N = True
USE_TZ = True

# models.py
class Program(models.Model):
    objects = models.Manager()
    objects_custom = ProgramManager()
    class Meta:
        ordering = ['id']
    name = models.CharField(max_length=100, null=False)
    program_budget = models.CharField(max_length=100, null=False)
    company = models.ForeignKey(Company, on_delete=models.CASCADE, null=True)
    active = models.BooleanField(default=True)
    uuid4 = models.CharField(max_length=50, unique=True, null=True)
    country_list = models.TextField(null=True)
    method_payment = models.CharField(max_length=100, null=True)
    currency = models.CharField(max_length=4, default='USD', null=True)
    create_at = models.DateTimeField(auto_now_add=True, null=True)
    discharge_program = models.DateTimeField(auto_now_add=True, null=True)
    updated_at = models.DateTimeField(auto_now=True)
    deleted_at = models.DateTimeField(null=True)
    is_saved = models.NullBooleanField(default=False, null=True, blank=True)
    is_suspended = models.BooleanField(default=False)
    start_at = models.DateTimeField(null=True)
    finish_at = models.DateTimeField(null=True)

# utils.py
from datetime import datetime, time
import pytz
from settings.py import TIME_ZONE
def get_start_at(date):
    """Obtain the current day initialize in the first second of the day.
    Parameters:
        date (date): date object

    Returns:
        (datetime): YYYY-MM-DD 00:00:00
    """
    return datetime.combine(date, time.min, pytz.timezone(TIME_ZONE))


Here are my values to create the register:
{
    'has_individual_budget': False, 
    'name': 'plan test create program start_at datetime', 
    'program_budget': '0', 
    'uuid4', 'd6effacf-3c19-48db-ab06-5af1d97df599', 
     'country_list': '[{"id":239,"name":"Venezuela","iso_code2":"VE","iso_code3":"VEN","phone_prefix":58,"currency":"VEF","flag":"U+1F1FB        U+1F1EA","phone_national_regex":"^[68]00\\\\d{7}|(?:[24]\\\\d|[59]0)\\\\d{8}$","active":1}]', 
    'method_payment': '7fb39a7e-a6de-488b-9564-9bd853b598ec', 
    'currency': 'USD', 
    'is_saved': False, 
    'start_at': datetime.datetime(2022, 3, 28, 0, 0, tzinfo=<DstTzInfo 'America/Mexico_City' LMT-1 day, 17:23:00 STD>), 
    'finish_at': datetime.datetime(2022, 4, 27, 23, 59, 59, 999999, tzinfo=<DstTzInfo 'America/Mexico_City' LMT-1 day, 17:23:00 STD>), 
    'company': <Company: Company object (247)>, 
    'card_provider': <CardProvider: stripe-usa>, 
    'payment_provider': <CardProvider: stripe-usa>
                \'2022-03-28T00:00:00-06:37\'::timestamptz, -- start_field, notice that the timezone part should be -06 but it is -06:37
                \'2022-04-27T23:59:59.999999-06:37\'::timestamptz, 
                false, 
                1, 
                1
            ) 
        RETURNING "user_program"."id"', 
    'time': '0.267'
}


Plase tell me how to fix that, if I need to change the TIME_ZONE or something.

Regards, Andres.

Antonis Christofides

unread,
Mar 30, 2022, 3:02:56 AM3/30/22
to django...@googlegroups.com

Hi,

not what you asked, but

    from settings import TIME_ZONE

is an error. It happens to work in this case, but generally you should write

    from django.conf import settings

and then use "settings.TIME_ZONE". In Django, "settings" isn't a module, it's an object. Django has some logic when populating that object with attributes. An obvious example is that you can django the DJANGO_SETTINGS_MODULES environment variable to specify a different settings file.

Now, regarding what you asked, the pytz documentation has the following warning:

Unfortunately using the tzinfo argument of the standard datetime constructors ‘’does not work’’ with pytz for many timezones.

I don't remember the correct way to do it, since I'm always confused by how pytz works, and also its usage is deprecated because of the existence of the new "zoneinfo" Python standard library module.

Regards,

Antonis

Antonis Christofides
+30-6979924665 (mobile)

Andrés Alvarez

unread,
Mar 30, 2022, 11:00:22 AM3/30/22
to Django users
Thanks Anthony, I didn't know that pytz is deprecated. Now with zoneinfo is working.

Regards, Andres.

Reply all
Reply to author
Forward
0 new messages