Skip to content

Instantly share code, notes, and snippets.

@phuocphn
Created May 10, 2018 14:26
Show Gist options
  • Save phuocphn/04d2d3707ad3365b0a57f32eeaab049f to your computer and use it in GitHub Desktop.
Save phuocphn/04d2d3707ad3365b0a57f32eeaab049f to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
import unittest
import re
import datetime
from dateutil.relativedelta import relativedelta
#Standard datetime_string is string have all written by English, no GMT+xx, no [ago, today, yesterday] tag
def convert_to_standard_datetime_string(datetime_string):
if not datetime_string:
return None
now = datetime.datetime.now()
DAYS_OF_WEEK = {
'Monday': ["Thứ hai", "Thứ 2", "Mon"],
'Tuesday': ["Thứ ba", "Thứ 3", "Tue"],
'Wednesday': ["Thứ tư", "Thứ 4", "Wed"],
'Thursday': ["Thứ năm", "Thứ 5", "Thu"],
'Friday': ["Thứ sáu", "Thứ 6", "Fri"],
'Saturday': ["Thứ bảy", "Thứ 7", "Sat"],
'Sunday': ["Chủ nhật", "Sun"],
}
MONTHS_OF_YEAR = {
"Jan": ["Tháng một",],
"Feb": ["Tháng hai",],
"Mar": ["Tháng ba",],
"Apr":["Tháng tư",],
"May": ["Tháng năm",],
"Jun": ["Tháng sáu",],
"Jul":["Tháng bảy",],
"Aug":["Tháng tám",],
"Sep":["Tháng chín",],
"Oct":["Tháng mười",],
"Nov":["Tháng mười một",],
"Dec":["Tháng mười hai",]
}
MONTH_TIMESINCE_WORDS = ["tháng trước", "months ago", "month ago" ]
DAY_TIMESINCE_WORDS = ["ngày trước", "days ago", "day ago"]
HOUR_TIMESINCE_WORDS = ["giờ trước", "hours ago", "hour ago"]
now = datetime.datetime.now()
today = datetime.datetime.today()
datetime_string = re.sub(r"GMT\+\d{1,2}", r"", datetime_string)
for standard_day, variant_days in DAYS_OF_WEEK.items():
for variant_day in variant_days:
datetime_string = re.sub(r"{}([\s,.//\\])".format(variant_day), standard_day + r'\1', datetime_string)
for standard_month, variant_months in MONTHS_OF_YEAR.items():
for variant_month in variant_months:
datetime_string = re.sub(r"{}([\s,.//\\])".format(variant_month), standard_month + r'\1', datetime_string)
for month_timesince_word in MONTH_TIMESINCE_WORDS:
if datetime_string.find(month_timesince_word) >= 0:
month_value = -1
search_obj = re.search( r'(\d+) {}'.format(month_timesince_word), datetime_string, re.M|re.I)
if search_obj:
month_value = int(search_obj.group(1))
if month_value != -1:
specific_pasttime = today - datetime.timedelta(days = 30 * month_value)
datetime_string = re.sub(r"\d+\s{}".format(month_timesince_word), "{}/{}/{}".format(specific_pasttime.day, specific_pasttime.month, specific_pasttime.year), datetime_string)
for day_timesince_word in DAY_TIMESINCE_WORDS:
if datetime_string.find(day_timesince_word) >= 0:
day_value = -1
search_obj = re.search( r'(\d+) {}'.format(day_timesince_word), datetime_string, re.M|re.I)
if search_obj:
day_value = int(search_obj.group(1))
if day_value != -1:
specific_pasttime = today - datetime.timedelta(days = day_value)
datetime_string = re.sub(r"\d+\s{}".format(day_timesince_word), "{}/{}/{}".format(specific_pasttime.day, specific_pasttime.month, specific_pasttime.year), datetime_string)
for hour_timesince_word in HOUR_TIMESINCE_WORDS:
if datetime_string.find(hour_timesince_word) >= 0:
hour = -1
search_obj = re.search( r'(\d+) {}'.format(hour_timesince_word), datetime_string, re.M|re.I)
if search_obj:
hour = int(search_obj.group(1))
if hour != -1:
specific_pasttime = today - datetime.timedelta(hours = hour)
datetime_string = re.sub(r"\d+\s{}".format(hour_timesince_word), "{}:{}:{}".format(specific_pasttime.hour, specific_pasttime.minute, specific_pasttime.second), datetime_string)
return datetime_string
class TestModule(unittest.TestCase):
def setUp(self):
pass
def test_replace_days_of_week(self):
#pass
self.assertEqual(convert_to_standard_datetime_string("Chủ nhật, 15/4/2018 | 04:00"), "Sunday, 15/4/2018 | 04:00")
self.assertEqual(convert_to_standard_datetime_string("Thứ 3, 15/4/2018 | 04:00"), "Tuesday, 15/4/2018 | 04:00")
self.assertEqual(convert_to_standard_datetime_string("Thứ tư, 15/4/2018 | 04:00"), "Wednesday, 15/4/2018 | 04:00")
def test_replace_months_of_week(self):
#pass
self.assertEqual(convert_to_standard_datetime_string("15//2018 | 04:00"), "15//2018 | 04:00")
self.assertEqual(convert_to_standard_datetime_string("15/4/Tháng sáu/2018 | 04:00"), "15/4/Jun/2018 | 04:00")
self.assertEqual(convert_to_standard_datetime_string("15/Tháng ba/2018 | 04:00"), "15/Mar/2018 | 04:00")
pass
def test_remove_gmt_string(self):
self.assertEqual(convert_to_standard_datetime_string("Chủ nhật, 15/4/2018 | 04:00 GMT+7"), "Sunday, 15/4/2018 | 04:00 ")
self.assertEqual(convert_to_standard_datetime_string("GMT+20 Thứ 3, 15/4/2018 | 04:00 GMT+7"), " Tuesday, 15/4/2018 | 04:00 ")
self.assertEqual(convert_to_standard_datetime_string("Thứ tư, 15/4/2018 |GMT+3 04:00"), "Wednesday, 15/4/2018 | 04:00")
def test_convert_timesince_ago(self):
now = datetime.datetime.now()
past_time = datetime.datetime.today() - datetime.timedelta(days = 30 * 1)
self.assertEqual(convert_to_standard_datetime_string("1 tháng trước"), "{}/{}/{}".format(past_time.day, past_time.month, past_time.year))
past_time = datetime.datetime.today() - datetime.timedelta(days = 30 * 1)
self.assertEqual(convert_to_standard_datetime_string("1 month ago"), "{}/{}/{}".format(past_time.day, past_time.month, past_time.year))
past_time = datetime.datetime.today() - datetime.timedelta(days = 30 * 11)
self.assertEqual(convert_to_standard_datetime_string("11 tháng trước"), "{}/{}/{}".format(past_time.day, past_time.month, past_time.year))
past_time = datetime.datetime.today() - datetime.timedelta(days = 30 * 11)
self.assertEqual(convert_to_standard_datetime_string("11 months ago"), "{}/{}/{}".format(past_time.day, past_time.month, past_time.year))
past_time = datetime.datetime.today() - datetime.timedelta(days = 21)
self.assertEqual(convert_to_standard_datetime_string("21 ngày trước"), "{}/{}/{}".format(past_time.day, past_time.month, past_time.year))
past_time = datetime.datetime.today() - datetime.timedelta(days = 2)
self.assertEqual(convert_to_standard_datetime_string("2 ngày trước"), "{}/{}/{}".format(past_time.day, past_time.month, past_time.year))
past_time = datetime.datetime.today() - datetime.timedelta(days = 2)
self.assertEqual(convert_to_standard_datetime_string("2 days ago"), "{}/{}/{}".format(past_time.day, past_time.month, past_time.year))
past_time = datetime.datetime.today() - datetime.timedelta(hours = 2)
self.assertEqual(convert_to_standard_datetime_string("2 hours ago"), "{}:{}:{}".format(past_time.hour, past_time.minute, past_time.second))
past_time = datetime.datetime.today() - datetime.timedelta(hours = 25)
self.assertEqual(convert_to_standard_datetime_string("25 giờ trước"), "{}:{}:{}".format(past_time.hour, past_time.minute, past_time.second))
def test_convert_string_to_datetime_python(self):
raw_string = "21 giờ trước"
standard_string = convert_to_standard_datetime_string(raw_string)
datetime_obj = datetime.datetime.strptime(standard_string, "%H:%M:%S")
past_time = datetime.datetime.today() - datetime.timedelta(hours = 21)
self.assertEqual(datetime_obj.hour, past_time.hour)
self.assertEqual(datetime_obj.minute, past_time.minute)
self.assertEqual(datetime_obj.second, past_time.second)
def test_vnexpress_time_format(self):
raw_string = "Thứ ba, 8/5/2018 | 15:49 GMT+7"
standard_string =convert_to_standard_datetime_string(raw_string)
self.assertEqual(standard_string, "Tuesday, 8/5/2018 | 15:49 ")
datetime_obj = datetime.datetime.strptime(standard_string, "%A, %d/%m/%Y | %H:%M ")
self.assertEqual(datetime_obj.hour, 15)
self.assertEqual(datetime_obj.minute, 49)
self.assertEqual(datetime_obj.day, 8)
self.assertEqual(datetime_obj.month, 5)
if __name__ == '__main__':
unittest.main()
#Thứ ba, 8/5/2018 | 15:49 GMT+7
#21 GIỜ TRƯỚC
#5 ngày trước đây
#2 phút trước
#7 phút trưóc
#Chủ nhật, 15/4/2018 | 04:00 GMT+7
#Hôm nay, 12:34
#Today,4:45
#Hôm qua, 12:34
#Yesterday, 4:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment