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)


On 29/03/2022 17.51, Andrés Alvarez wrote:
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>
}

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, -- 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.

El martes, 29 de marzo de 2022 a la(s) 01:41:42 UTC-4, Antonis Christofides escribió:

    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  <tel:+30%20697%20992%204665>  (mobile)


    On 28/03/2022 22.02, Andrés Alvarez wrote:
    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.

-- 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
    
<https://groups.google.com/d/msgid/django-users/1999ec1e-9170-432e-adc0-71cab3dece6an%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
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+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/d1cfcde9-3d21-4918-8edf-b9366b1dfa33n%40googlegroups.com <https://groups.google.com/d/msgid/django-users/d1cfcde9-3d21-4918-8edf-b9366b1dfa33n%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/a2036ff5-a892-2e34-7df3-d1c7354b655c%40antonischristofides.com.

Reply via email to