Python日付から曜日・月を日本語英語で取得する方法【完全版】

Pythonで日付から曜日や月の名前を日本語や英語で取得する方法を詳しく解説します。標準ライブラリとlocaleモジュールを活用した実装方法を学びましょう。

基本的な曜日・月の取得

英語での曜日・月取得

from datetime import datetime

# サンプル日付
dt = datetime(2024, 1, 15)  # 2024年1月15日(月曜日)

# 英語での曜日取得
print(f"曜日(完全形): {dt.strftime('%A')}")    # Monday
print(f"曜日(短縮形): {dt.strftime('%a')}")    # Mon

# 英語での月取得
print(f"月(完全形): {dt.strftime('%B')}")      # January
print(f"月(短縮形): {dt.strftime('%b')}")      # Jan

# 曜日番号(0=月曜, 6=日曜)
print(f"曜日番号: {dt.weekday()}")               # 0 (Monday)
print(f"曜日番号(日曜始まり): {dt.isoweekday()}")  # 1 (Monday)

数値から曜日・月を取得

from datetime import datetime

# 曜日番号から英語名を取得
weekdays_en = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 
               'Friday', 'Saturday', 'Sunday']

dt = datetime(2024, 1, 15)
weekday_index = dt.weekday()
print(f"曜日: {weekdays_en[weekday_index]}")

# 月番号から英語名を取得
months_en = ['', 'January', 'February', 'March', 'April', 'May', 
             'June', 'July', 'August', 'September', 'October', 
             'November', 'December']

month_index = dt.month
print(f"月: {months_en[month_index]}")

日本語での曜日・月取得

辞書を使用した日本語変換

from datetime import datetime

def get_japanese_weekday(dt):
    """日付から日本語の曜日を取得"""
    weekdays_jp = ['月', '火', '水', '木', '金', '土', '日']
    return weekdays_jp[dt.weekday()]

def get_japanese_month(dt):
    """日付から日本語の月を取得"""
    months_jp = ['', '1月', '2月', '3月', '4月', '5月', '6月',
                 '7月', '8月', '9月', '10月', '11月', '12月']
    return months_jp[dt.month]

# 使用例
dt = datetime(2024, 1, 15)
print(f"曜日: {get_japanese_weekday(dt)}曜日")     # 月曜日
print(f"月: {get_japanese_month(dt)}")           # 1月

# 完全な日本語表記
jp_date = f"{dt.year}年{get_japanese_month(dt)}{dt.day}日({get_japanese_weekday(dt)})"
print(jp_date)  # 2024年1月15日(月)

複数形式の日本語曜日・月

from datetime import datetime

class JapaneseDate:
    def __init__(self):
        self.weekdays = {
            'short': ['月', '火', '水', '木', '金', '土', '日'],
            'long': ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日'],
            'kanji': ['月', '火', '水', '木', '金', '土', '日']
        }
        
        self.months = {
            'number': ['', '1月', '2月', '3月', '4月', '5月', '6月',
                      '7月', '8月', '9月', '10月', '11月', '12月'],
            'kanji': ['', '睦月', '如月', '弥生', '卯月', '皐月', '水無月',
                     '文月', '葉月', '長月', '神無月', '霜月', '師走']
        }
    
    def get_weekday(self, dt, format_type='short'):
        """曜日を指定形式で取得"""
        return self.weekdays[format_type][dt.weekday()]
    
    def get_month(self, dt, format_type='number'):
        """月を指定形式で取得"""
        return self.months[format_type][dt.month]

# 使用例
jp_date = JapaneseDate()
dt = datetime(2024, 1, 15)

print(f"短縮曜日: {jp_date.get_weekday(dt, 'short')}")      # 月
print(f"完全曜日: {jp_date.get_weekday(dt, 'long')}")       # 月曜日
print(f"数字月: {jp_date.get_month(dt, 'number')}")         # 1月
print(f"和名月: {jp_date.get_month(dt, 'kanji')}")          # 睦月

localeを使用した多言語対応

localeモジュールでの言語設定

import locale
from datetime import datetime

def get_localized_date(dt, locale_name):
    """指定されたロケールで日付を取得"""
    try:
        # 元のロケールを保存
        original_locale = locale.getlocale()
        
        # 新しいロケールを設定
        locale.setlocale(locale.LC_TIME, locale_name)
        
        # ローカライズされた日付文字列を取得
        weekday = dt.strftime('%A')
        month = dt.strftime('%B')
        formatted = dt.strftime('%Y年%m月%d日 (%A)')
        
        # 元のロケールに戻す
        locale.setlocale(locale.LC_TIME, original_locale)
        
        return {
            'weekday': weekday,
            'month': month,
            'formatted': formatted
        }
    
    except locale.Error as e:
        return f"ロケールエラー: {e}"

# 使用例(システムに日本語ロケールがインストールされている場合)
dt = datetime(2024, 1, 15)

# 利用可能なロケールの確認
available_locales = locale.locale_alias.keys()
jp_locales = [loc for loc in available_locales if 'ja' in loc.lower()]
print(f"日本語ロケール候補: {list(jp_locales)[:5]}")

# 英語での表示
en_result = get_localized_date(dt, 'C')  # 標準Cロケール
print(f"英語: {en_result}")

実用的な日付フォーマット関数

多言語対応日付フォーマッタ

from datetime import datetime

class MultiLanguageDateFormatter:
    def __init__(self):
        self.languages = {
            'ja': {
                'weekdays': ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日'],
                'weekdays_short': ['月', '火', '水', '木', '金', '土', '日'],
                'months': ['', '1月', '2月', '3月', '4月', '5月', '6月',
                          '7月', '8月', '9月', '10月', '11月', '12月'],
                'months_kanji': ['', '睦月', '如月', '弥生', '卯月', '皐月', '水無月',
                               '文月', '葉月', '長月', '神無月', '霜月', '師走']
            },
            'en': {
                'weekdays': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 
                           'Friday', 'Saturday', 'Sunday'],
                'weekdays_short': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                'months': ['', 'January', 'February', 'March', 'April', 'May', 'June',
                          'July', 'August', 'September', 'October', 'November', 'December'],
                'months_short': ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
            }
        }
    
    def format_date(self, dt, lang='ja', style='full'):
        """指定された言語とスタイルで日付をフォーマット"""
        lang_data = self.languages.get(lang, self.languages['en'])
        
        if lang == 'ja':
            if style == 'full':
                weekday = lang_data['weekdays'][dt.weekday()]
                month = lang_data['months'][dt.month]
                return f"{dt.year}年{month}{dt.day}日 {weekday}"
            elif style == 'short':
                weekday = lang_data['weekdays_short'][dt.weekday()]
                return f"{dt.month}/{dt.day}({weekday})"
            elif style == 'traditional':
                weekday = lang_data['weekdays_short'][dt.weekday()]
                month = lang_data['months_kanji'][dt.month]
                return f"{dt.year}年{month}{dt.day}日 {weekday}曜日"
        
        elif lang == 'en':
            if style == 'full':
                weekday = lang_data['weekdays'][dt.weekday()]
                month = lang_data['months'][dt.month]
                return f"{weekday}, {month} {dt.day}, {dt.year}"
            elif style == 'short':
                weekday = lang_data['weekdays_short'][dt.weekday()]
                month = lang_data['months_short'][dt.month]
                return f"{weekday}, {month} {dt.day}"
        
        return str(dt)

# 使用例
formatter = MultiLanguageDateFormatter()
dt = datetime(2024, 1, 15)

print("=== 日本語フォーマット ===")
print(f"完全形: {formatter.format_date(dt, 'ja', 'full')}")
print(f"短縮形: {formatter.format_date(dt, 'ja', 'short')}")
print(f"伝統形: {formatter.format_date(dt, 'ja', 'traditional')}")

print("\n=== 英語フォーマット ===")
print(f"完全形: {formatter.format_date(dt, 'en', 'full')}")
print(f"短縮形: {formatter.format_date(dt, 'en', 'short')}")

カレンダー表示用の曜日取得

from datetime import datetime, timedelta

def get_week_days(start_date, lang='ja'):
    """指定日から1週間の曜日を取得"""
    weekdays_ja = ['月', '火', '水', '木', '金', '土', '日']
    weekdays_en = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    
    weekdays = weekdays_ja if lang == 'ja' else weekdays_en
    
    week_data = []
    for i in range(7):
        current_date = start_date + timedelta(days=i)
        weekday_name = weekdays[current_date.weekday()]
        week_data.append({
            'date': current_date,
            'weekday': weekday_name,
            'day': current_date.day
        })
    
    return week_data

# 使用例
start = datetime(2024, 1, 15)  # 月曜日から開始
week_schedule = get_week_days(start, 'ja')

print("=== 週間スケジュール ===")
for day_info in week_schedule:
    print(f"{day_info['date'].strftime('%m/%d')} ({day_info['weekday']})")

特殊な曜日・月の表現

六曜(大安、仏滅など)の取得

from datetime import datetime

def get_rokuyou(dt):
    """日付から六曜を取得"""
    rokuyou_names = ['大安', '赤口', '先勝', '友引', '先負', '仏滅']
    
    # 六曜の計算(月日の数を6で割った余り)
    rokuyou_index = (dt.month + dt.day) % 6
    return rokuyou_names[rokuyou_index]

# 使用例
dt = datetime(2024, 1, 15)
rokuyou = get_rokuyou(dt)
print(f"{dt.strftime('%Y年%m月%d日')}: {rokuyou}")

干支(十二支)の取得

from datetime import datetime

def get_zodiac(year):
    """年から干支を取得"""
    zodiac_animals = ['子', '丑', '寅', '卯', '辰', '巳', 
                     '午', '未', '申', '酉', '戌', '亥']
    
    # 1900年が子年(0番目)
    zodiac_index = (year - 1900) % 12
    return zodiac_animals[zodiac_index]

def get_zodiac_full(year):
    """年から干支(漢字名)を取得"""
    zodiac_full = ['ねずみ', 'うし', 'とら', 'うさぎ', 'たつ', 'へび',
                   'うま', 'ひつじ', 'さる', 'とり', 'いぬ', 'いのしし']
    
    zodiac_index = (year - 1900) % 12
    return zodiac_full[zodiac_index]

# 使用例
year = 2024
print(f"{year}年: {get_zodiac(year)}年({get_zodiac_full(year)}年)")

実用的な応用例

カレンダーヘッダーの生成

from datetime import datetime, timedelta

def generate_calendar_header(year, month, lang='ja'):
    """カレンダーのヘッダーを生成"""
    if lang == 'ja':
        weekdays = ['月', '火', '水', '木', '金', '土', '日']
        month_name = f"{month}月"
    else:
        weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
        month_names = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                      'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
        month_name = month_names[month]
    
    # ヘッダー文字列の生成
    header = f"{year} {month_name}\n"
    header += " ".join(f"{wd:>3}" for wd in weekdays)
    
    return header

# 使用例
print(generate_calendar_header(2024, 1, 'ja'))
print()
print(generate_calendar_header(2024, 1, 'en'))

多言語対応の日付入力パーサー

import re
from datetime import datetime

class DateParser:
    def __init__(self):
        self.jp_weekdays = {
            '月': 0, '火': 1, '水': 2, '木': 3, '金': 4, '土': 5, '日': 6,
            '月曜': 0, '火曜': 1, '水曜': 2, '木曜': 3, '金曜': 4, '土曜': 5, '日曜': 6
        }
        
        self.jp_months = {
            '1月': 1, '2月': 2, '3月': 3, '4月': 4, '5月': 5, '6月': 6,
            '7月': 7, '8月': 8, '9月': 9, '10月': 10, '11月': 11, '12月': 12
        }
    
    def parse_japanese_date(self, date_str):
        """日本語の日付文字列を解析"""
        # "2024年1月15日"形式
        pattern = r'(\d{4})年(\d{1,2})月(\d{1,2})日'
        match = re.search(pattern, date_str)
        
        if match:
            year, month, day = map(int, match.groups())
            return datetime(year, month, day)
        
        return None
    
    def get_weekday_from_japanese(self, weekday_str):
        """日本語の曜日文字列から曜日番号を取得"""
        return self.jp_weekdays.get(weekday_str)

# 使用例
parser = DateParser()

# 日本語日付の解析
jp_date_str = "2024年1月15日"
parsed_date = parser.parse_japanese_date(jp_date_str)
if parsed_date:
    print(f"解析結果: {parsed_date}")
    
# 曜日の取得
weekday_num = parser.get_weekday_from_japanese('月')
print(f"月曜日の番号: {weekday_num}")

営業日計算(曜日考慮)

from datetime import datetime, timedelta

def is_business_day(dt, lang='ja'):
    """営業日かどうかを判定"""
    weekday = dt.weekday()
    is_business = weekday < 5  # 月〜金(0-4)
    
    if lang == 'ja':
        weekdays = ['月', '火', '水', '木', '金', '土', '日']
        day_name = weekdays[weekday]
        status = "営業日" if is_business else "休業日"
        return f"{day_name}曜日 - {status}"
    else:
        weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 
                   'Friday', 'Saturday', 'Sunday']
        day_name = weekdays[weekday]
        status = "Business Day" if is_business else "Weekend"
        return f"{day_name} - {status}"

def get_next_business_day(dt):
    """次の営業日を取得"""
    next_day = dt + timedelta(days=1)
    while next_day.weekday() >= 5:  # 土日をスキップ
        next_day += timedelta(days=1)
    return next_day

# 使用例
today = datetime(2024, 1, 15)  # 月曜日
print(f"今日: {is_business_day(today, 'ja')}")

# 金曜日の場合
friday = datetime(2024, 1, 19)
print(f"金曜日: {is_business_day(friday, 'ja')}")
next_business = get_next_business_day(friday)
print(f"次の営業日: {next_business.strftime('%Y年%m月%d日')} ({is_business_day(next_business, 'ja')})")

祝日考慮の日付表示

from datetime import datetime

def get_japanese_holiday_name(dt):
    """日本の祝日名を取得(簡略版)"""
    holidays = {
        (1, 1): "元日",
        (2, 11): "建国記念の日",
        (4, 29): "昭和の日",
        (5, 3): "憲法記念日",
        (5, 4): "みどりの日",
        (5, 5): "こどもの日",
        (12, 23): "天皇誕生日",
    }
    
    return holidays.get((dt.month, dt.day))

def format_date_with_holiday(dt):
    """祝日情報付きの日付表示"""
    weekdays = ['月', '火', '水', '木', '金', '土', '日']
    weekday = weekdays[dt.weekday()]
    
    base_format = f"{dt.year}年{dt.month}月{dt.day}日({weekday})"
    
    holiday = get_japanese_holiday_name(dt)
    if holiday:
        return f"{base_format} {holiday}"
    else:
        return base_format

# 使用例
dates = [
    datetime(2024, 1, 1),   # 元日
    datetime(2024, 1, 15),  # 平日
    datetime(2024, 5, 5),   # こどもの日
]

for date in dates:
    print(format_date_with_holiday(date))

まとめ

  • 基本取得strftime(), weekday(), monthプロパティ
  • 日本語対応:辞書による変換、カスタムフォーマッタ
  • 多言語対応:localeモジュール、多言語クラス
  • 実用例:カレンダー、営業日計算、祝日表示
  • 特殊表現:六曜、干支、伝統的な月名

これらの方法を活用することで、様々な形式での日付表示が実現できます。

らくらくPython塾 – 読むだけでマスター

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座