Created
May 10, 2018 14:26
-
-
Save phuocphn/04d2d3707ad3365b0a57f32eeaab049f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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