Skip to content

Instantly share code, notes, and snippets.

@andelf
Created November 9, 2019 10:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andelf/159512bef25cbd6a95779db301d3cd9e to your computer and use it in GitHub Desktop.
Save andelf/159512bef25cbd6a95779db301d3cd9e to your computer and use it in GitHub Desktop.
fix wrong django timezone
import sys
import os.path
from datetime import datetime, timedelta
from pprint import pprint
import pytz
__dir__ = os.path.dirname(__file__)
__proj_dir__ = os.path.dirname(__dir__)
sys.path.insert(0, __proj_dir__)
import django
from django.conf import settings
from django.db import transaction, models
import django.apps
django.setup()
original_tz = 'America/Chicago'
current_tz = 'Asia/Shanghai'
def get_model_datetime_fields(model):
fields_need_fix = []
for f in model._meta.get_fields():
if isinstance(f, models.DateTimeField):
fields_need_fix.append(f.attname)
return fields_need_fix
def fix_datetime(val):
TZ = pytz.timezone(original_tz)
val = val.astimezone(pytz.UTC)
val = val.astimezone(TZ)
val = val.replace(tzinfo=None)
return val
@transaction.atomic
def fix_model(model, fields):
for obj in model.objects.all():
for field in fields:
val = getattr(obj, field)
if val:
fixed_val = fix_datetime(val)
print(val, fixed_val)
setattr(obj, field, fixed_val)
obj.save()
if __name__ == "__main__":
for model in django.apps.apps.get_models()[::-1]:
if not model.objects.count():
continue
fields = get_model_datetime_fields(model)
if not fields:
continue
print(model)
print(' ', fields)
fix_model(model, fields)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment