import datetime

"""
Explanation: Python의  날짜 및 시간 관련 패키지 소개


날짜/시간 관련 패키지


datetime 

https://docs.python.org/2/library/datetime.html



time

https://docs.python.org/2/library/time.html



pytz

http://pythonhosted.org/pytz/



dateutil

http://dateutil.readthedocs.org/en/latest/index.html



datetime 패키지

서브 패키지
datetime 클래스 : 날짜+시간 복합 정보
date 클래스: 날짜 정보
time 클래스: 시간 정보
timedelta 클래스: 시간 차이 정보
tzinfo 클래스: 시간대 정보
End of explanation
"""


dt = datetime.datetime.now()
dt

type(dt)

"""
Explanation: datetime.datetime 클래스

날짜와 시간 정보를 가지는 객체
Class Methods
now([tz]): 현재 시각
strptime(date_string, format): 문자열 -> datetime 
fromtimestamp(): timestamp -> datetime
fromordinal(ordinal): proleptic Gregorian ordinal (엑셀 날짜) -> datetime
combine(date, time): date + time -> datetime

현재시각
End of explanation
"""


dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo

dt.weekday() #  {0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일}

"""
Explanation: Instance Attributes 속성
year, month, day, hour, minute, second, microsecond
tzinfo
Instance Methods 메소드
weekday(): 요일 {0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일}
strftime(format): datetime -> 문자열
toordinal(): datetime -> proleptic Gregorian ordinal (엑셀 날짜)
date(): datetime -> date
time(): datetime -> time
End of explanation
"""


dt1 = datetime.datetime.strptime("2016-08-23 07:20", "%Y-%m-%d %H:%M")
dt1

dt1.strftime("%d/%m/%y")

dt1.strftime("%A %d. %B %Y")

"""
Explanation: 문자열 변환

Parsing
문자열 -> datetime 
strptime(date_string, format)
Formatting
datetime -> 문자열
strftime(format)
End of explanation
"""


s = dt1.strftime("%Y년 %m월 %d일 %H시 %M분 %S초")
print(s)

s = dt1.strftime(u"%Y년 %m월 %d일 %H시 %M분 %S초".encode("utf-8"))
print(s)

"""
Explanation: format 기호
https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
%Y: 년, zero-padded decimal
%m: 월, zero-padded decimal
%d: 일, zero-padded decimal
%H: 시, zero-padded decimal
%M: 분, zero-padded decimal
%S: 초, zero-padded decimal
End of explanation
"""


dt = datetime.datetime.now()
dt

dt.date(), dt.time()

d = datetime.date(2015, 12, 31)
d

t = datetime.time(7, 27, 30)
t

datetime.datetime.combine(d, t)

"""
Explanation: datetime, date, time 변환

datetime -> date 또는 time 
date() 메소드 또는 time() 메소드
date + time -> datetime
combine() 메소드
End of explanation
"""


dt1 = datetime.datetime(2016, 8, 23, 16)
dt2 = datetime.datetime(2016, 4, 1, 4)
td = dt1- dt2
td

"""
Explanation: timedelta와 날짜시간 연산

빼기

datetime - datetime => timedelta


더하기 

datetime + timedelta => datetime
End of explanation
"""


td.days, td.seconds, td.microseconds

td.total_seconds()

"""
Explanation: timedelta 클래스

속성
days: 일수
seconds: 초. (0 ~ 86399)

microseconds: 마이크로초 (0 and 999999)


메소드

total_seconds(): 모든 속성을 초단위로 모아서 변환
End of explanation
"""


import time
print("start...")
time.sleep(1)
print(1)
time.sleep(2)
print(2)
time.sleep(3)
print(3)
time.sleep(4)
print(4)
time.sleep(1)
print("finish!")

"""
Explanation: time 패키지

platform C library 기반의 low 레벨 시간처리
https://docs.python.org/2/library/time.html

sleep 함수

일정 시간 동안 프로세스 정지
End of explanation
"""


time.time()

ts = time.localtime()
ts

time.mktime(ts)

"""
Explanation: time 패키지의 시간 표시

time_struct
9-tuple 내부 구조체
단일 부동소수점 숫자 
시간을 하나의 숫자로 표시 가능
time 패키지의 모든 시각은 epoch로부터 흐른 초단위 숫자로 표시
epoch
1970년 1월 1일 0시 기준

time package 명령어

time(): 현재 시각을 단일 부동소수점 숫자로 반환
localtime(): 현재 시각을 time_struct로 반환
mktime(ts): time_struct -> 단일 부동소수점 숫자 변환
End of explanation
"""


import pytz

seoul = pytz.timezone("Asia/Seoul")
seoul

"""
Explanation: pytz 패키지

세계 시간대 변환
End of explanation
"""


t1 = datetime.datetime.now()
t1

lt1 = seoul.localize(t1)
lt1

t2 = datetime.datetime.utcnow()
t2

lt2 = pytz.utc.localize(t2)
lt2

lt3 = t2.replace(tzinfo=pytz.utc)
lt3

"""
Explanation: datetime 객체에 시간대 정보 넣기

localize 메소드
End of explanation
"""


t1 = datetime.datetime.now()
lt1 = seoul.localize(t1)
lt4 = lt1.astimezone(pytz.timezone("US/Eastern"))
lt4

"""
Explanation: 타시간대로 변환

astimezone 메소드
End of explanation
"""


from dateutil.parser import parse

parse('2016-08-23')

parse("Aug 23, 2016 07:40:33 AM")

parse('7/7/2009')

"""
Explanation: http://www.timeanddate.com/worldclock/usa/new-york

dateutil

parse 함수
relativedelta 클래스

parse() 함수

많이 사용되는 날짜 시간 관련 문자열 형식을 스스로 판단
End of explanation
"""


