Mac에서 UTC 타임스탬프에서 정확한 시간 수를 빼려면 UTC 오프셋을 사용해 파싱하고, 시간을 뺀 다음, 결과를 UTC로 명시적으로 출력하세요. 이 터미널 작업 흐름에서는 Python과 가상의 게시 날짜를 사용합니다.

여기서 할 작업은 구체적입니다. 0 이상의 정수 시간만큼 게시 타임스탬프를 과거로 이동하면서 입력과 출력을 모두 UTC로 유지합니다. 예를 들어 2026-05-12T02:30:00Z에서 7시간을 빼면 2026-05-11T19:30:00Z가 됩니다.

여기서 “정확한” 계산은 Python에 문서화된 datetime 모델을 따릅니다. 1시간은 3,600초이며 윤초는 표현되지 않습니다. 따라서 이 작업 흐름은 일반적인 게시 타임스탬프에 적합합니다. 윤초까지 계산해야 한다면 다른 시간 모델이 필요합니다. Python datetime 문서

어떤 종류의 날짜로 시작하나요?

계산하기 전에 달력 날짜와 타임스탬프를 구분하세요. 2026-05-12 같은 날짜만으로는 게시가 언제 이루어지는지 알 수 없습니다. 자정을 추가하거나 Mac의 현지 시간대를 가정하면 입력에 없는 정보를 끌어들이게 됩니다.

개념 가상의 예 의미
민간 날짜 2026-05-12 시간이나 오프셋이 없는 달력 날짜
현지 날짜 및 시간 2026-05-12T02:30:00 특정 시점을 식별하기에 맥락이 충분하지 않은 시계 값
UTC로 표현된 시점 2026-05-12T02:30:00Z 특정 시점
숫자 오프셋 +00:00 UTC와의 명시된 차이
명명된 시간대 Europe/Paris 현지 시각을 UTC와 연관 짓는 규칙

오프셋과 명명된 시간대는 서로 다른 용도로 사용됩니다. 숫자 오프셋은 타임스탬프와 UTC의 관계를 나타내고, 명명된 시간대는 날짜에 따라 달라질 수 있는 규칙을 제공합니다. RFC 9557은 이러한 차이를 정의하고 일부 현지 시각이 0개 또는 여러 시점에 대응할 수 있는 이유를 설명합니다. RFC 9557, 정의

이 작업에는 완전한 타임스탬프를 사용하세요. 아래 프로그램은 대문자 T, 초, 1~6자리의 선택적 소수 초, 그리고 Z 또는 +00:00을 허용합니다. 이는 의도적으로 제한한 RFC 3339 하위 집합입니다. RFC 3339의 타임스탬프 문법은 다른 오프셋과 더 많은 소수 자릿수도 허용합니다. RFC 3339, 날짜/시간 형식

터미널에서 시간을 빼려면 어떻게 하나요?

Mac에서 Python 준비하기

Finder를 열고 /Applications/Utilities로 이동한 다음 Terminal을 두 번 클릭하세요. Apple은 이를 명령줄 앱을 여는 방법으로 안내합니다. Mac에서 터미널 열기 또는 종료하기

다음 명령을 입력하고 Return을 누르세요.

python3 --version

이 안내에서는 Python 3.11 이상을 사용합니다. 적절한 인터프리터가 없다면 공식 macOS 설치 안내를 따르세요. 연결된 macOS 다운로드 페이지에서 지원되는 Python 설치 프로그램을 받아 .pkg 파일을 열고 문서화된 설치 단계를 완료하세요. 그런 다음 새 터미널 창을 열고 버전을 다시 확인하세요. Python 문서에는 설치 방법과 셸에서 Python을 실행하는 방법이 설명되어 있습니다. macOS에서 Python 사용하기

계산 전체 실행하기

아래 블록의 첫 줄과 마지막 줄까지 전부 복사해 터미널에 붙여넣고 Return을 누르세요. 다른 계산을 하려면 붙여넣기 전에 source_timestamp와 hours_to_subtract만 바꾸세요. 타임스탬프는 따옴표 안에 두고 시간은 정수로 입력하세요.

python3 - <<'PY'
import re
from datetime import datetime, timedelta, timezone

source_timestamp = "2026-05-12T02:30:00Z"
hours_to_subtract = 7

def subtract_utc_hours(text, hours):
    if type(hours) is not int or hours < 0:
        raise ValueError("Hours must be a non-negative whole number.")

    match = re.fullmatch(
        r"[0-9]{4}-[0-9]{2}-[0-9]{2}T"
        r"[0-9]{2}:[0-9]{2}:[0-9]{2}"
        r"(?P<fraction>\.[0-9]{1,6})?(?:Z|\+00:00)",
        text,
    )
    if match is None:
        raise ValueError(
            "Use YYYY-MM-DDTHH:MM:SS, optionally .ffffff, "
            "ending in Z or +00:00."
        )

    normalized = text[:-1] + "+00:00" if text.endswith("Z") else text
    start = datetime.fromisoformat(normalized).astimezone(timezone.utc)
    try:
        result = start - timedelta(hours=hours)
    except OverflowError as exc:
        raise ValueError(
            "The duration or result is outside the supported range."
        ) from exc

    # Whole-hour subtraction leaves the fractional second unchanged.
    seconds_text = result.isoformat(timespec="seconds")
    return seconds_text[:-6] + (match.group("fraction") or "") + "Z"

try:
    print(subtract_utc_hours(source_timestamp, hours_to_subtract))
except ValueError as exc:
    raise SystemExit(f"Cannot subtract: {exc}")
PY

제공된 가상의 게시 타임스탬프에 대한 출력은 다음과 같습니다.

2026-05-11T19:30:00Z

이 프로그램은 Python 표준 라이브러리만 사용하는 완전한 프로그램입니다. 파일을 만들지 않고 계산된 타임스탬프를 출력합니다. 결과를 준비 중인 게시 날짜 필드나 문서에 복사하세요.

API 호출 순서는 datetime.fromisoformat(), timezone.utc로 변환, timedelta(hours=hours) 빼기, isoformat()을 통한 출력입니다. Python 문서에는 이러한 파싱, 시간대, 시간 간격, 서식 지정 작업이 설명되어 있습니다. Python datetime API

프로그램은 UTC와 소수 초를 어떻게 유지하나요?

입력 검사는 UTC 표현이 명시되어 있는지 확인합니다. 오프셋이 없는 타임스탬프는 즉시 거부되므로 프로그램이 Mac 설정을 바탕으로 시간대를 추측할 필요가 없습니다. 허용된 두 접미사는 모두 오프셋이 0인 타임스탬프로 파싱되고, 출력에는 일관되게 Z이 사용됩니다.

UTC를 유지한다는 것은 원본 문자열의 모든 문자를 그대로 보존한다는 뜻은 아닙니다. +00:00로 끝나는 입력은 Z로 끝나는 결과가 됩니다. UTC 표현은 유지되지만 날짜와 시각은 요청한 시간만큼 과거로 이동합니다.

프로그램은 입력된 소수 초 텍스트도 보존합니다. 정수 시간만 빼므로 소수 부분은 바뀌지 않습니다. 따라서 .120은 .12이 되거나 사라지지 않고 .120로 유지됩니다. 소수 자릿수가 6자리를 넘는 입력은 잘라 내지 않고 거부합니다.

표준과 관련해 알아둘 점이 있습니다. Z은 UTC 오프셋이 0임을 나타내지만, 원래 위치의 시간대를 지정하지는 않습니다. RFC 9557은 RFC 3339에서 Z의 의미를 갱신해 현지 오프셋을 알 수 없는 경우도 허용합니다. 이 프로그램은 설계상 Z과 +00:00을 허용하고, 입력 정책에 따라 -00:00은 거부합니다. RFC 9557, RFC 3339 개정 사항

결과를 사용하기 전에 어떻게 확인할 수 있나요?

날짜가 바뀌는 계산부터 확인하세요. 기본 예에서 2시간을 과거로 이동하면 5월 12일의 00:30:00에 도달하고, 여기서 5시간을 더 이동하면 5월 11일의 19:30:00에 도달합니다. 결과가 5월 12일에 그대로 남아 있다면 잘못된 것입니다.

다음 가상 예시로 추가 확인을 할 수 있습니다. 각 행의 값을 재현하려면 전체 프로그램에서 입력값 두 개를 바꾸세요.

UTC 입력 뺀 시간 예상 UTC 출력
2026-05-12T02:30:00Z 7 2026-05-11T19:30:00Z
2026-01-01T00:15:00+00:00 1 2025-12-31T23:15:00Z
2028-03-01T00:30:00Z 1 2028-02-29T23:30:00Z
2026-05-12T02:30:00.120Z 7 2026-05-11T19:30:00.120Z
2026-05-12T02:30:00Z 0 2026-05-12T02:30:00Z

기본 예에서 시간 간격은 7 곱하기 3,600, 즉 25,200초입니다. 요청한 시간 간격은 정수 시간만으로 구성되므로 분과 초는 바뀌지 않습니다. 자정, 월 경계 또는 연도 경계를 넘으면 날짜가 바뀔 수 있습니다.

입력이 거부되면 어떻게 해야 하나요?

거부를 진단 단계로 활용하세요. 다시 시도하기 전에 누락된 정보를 확인하거나 지원되지 않는 정밀도 문제를 해결하세요.

  • 날짜만 있는 경우: 의도된 게시 시각과 해당 오프셋을 확인하세요. 민간 날짜만으로는 시작 시점을 식별할 수 없습니다.
  • 타임스탬프에 오프셋이 없는 경우: 접미사를 추가하기 전에 UTC 시각인지 현지 시각인지 확인하세요.
  • 타임스탬프의 오프셋이 0이 아닌 경우: 먼저 해당 시점을 UTC로 변환하세요. 접미사만 바꾸면 의미가 달라집니다.
  • 소수 자릿수가 6자리를 넘는 경우: 그 정밀도를 유지하는 도구를 사용하거나 이 작업 흐름을 사용하기 전에 명시적인 반올림 정책을 정하세요.
  • 시간이 음수이거나 소수인 경우: 0 이상의 정수를 입력하세요. 이 프로그램은 의도적으로 정수 시간만 빼도록 구현되어 있습니다.
  • 달력 값이 유효하지 않은 경우: 원본 값을 수정하세요. 2월 30일처럼 존재할 수 없는 날짜는 거부됩니다.

Python은 연도 1부터 9999까지의 datetime 값을 지원하며, 이 범위를 벗어나는 결과가 되도록 빼면 오류가 발생합니다. Python datetime 모델은 초 필드가 60인 값도 거부합니다. RFC 3339는 지정된 조건에서 윤초를 나타내기 위해 이 값을 허용합니다. Python datetime 한계, RFC 3339, 제한 사항

실제 요구 사항이 “이전 날의 동일한 현지 시각”이라면 명명된 시간대를 사용하는 달력 기반 작업 흐름을 이용하세요. 일광 절약 시간제 전환에 따라 명명된 시간대의 오프셋이 바뀔 수 있으므로, 이 작업은 경과 시간 24시간을 빼는 것과 다를 수 있습니다. Python의 zoneinfo 문서에는 이러한 전환을 가로지르는 산술 연산 예시가 나와 있습니다. Python IANA 시간대 지원

이미 UTC로 표현된 게시 타임스탬프라면 작업을 간단하게 유지하세요. 입력을 검증하고, 정수 시간만큼 빼고, 복사할 값에 명시적인 UTC 접미사를 유지하세요. 결과를 사용하기 전에 날짜 경계와 소수 정밀도를 확인하세요.

출처