90 lines
4.1 KiB
Python
90 lines
4.1 KiB
Python
import datetime
|
|
|
|
def solve():
|
|
# --- CONSTANTS FROM DATABASE/USER ---
|
|
# Actual wakeup time (UTC) from DB for session 1
|
|
wakeup_utc_str = "2026-05-27 03:17:00"
|
|
wakeup_utc = datetime.datetime.strptime(wakeup_utc_str, "%Y-%m-%d %H:%M:%S")
|
|
wakeup_utc_mins = wakeup_utc.hour * 60 + wakeup_utc.minute
|
|
|
|
# User's local reference time (Stockholm, UTC+2)
|
|
local_ref_str = "04:00"
|
|
local_ref_mins = 4 * 60
|
|
|
|
# Stockholm offset (UTC+2) -> getTimezoneOffset() returns -120
|
|
offset_in_minutes = -120
|
|
|
|
print(f"DATABASE WAKEUP (UTC): {wakeup_utc_str} ({wakeup_utc_mins} mins from midnight)")
|
|
print(f"LOCAL REFERENCE: {local_ref_str} ({local_ref_mins} mins from midnight)")
|
|
print(f"STOCKHOLM OFFSET: {offset_in_minutes} (getTimezoneOffset style)")
|
|
|
|
# --- SCENARIO 1: THE BUGGY WAY (Current implementation) ---
|
|
# Backend receives local "04:00" but treats it as UTC.
|
|
# Backend calculates delta = (UTC_wakeup - Ref_as_if_UTC)
|
|
ref_as_utc = local_ref_mins # 240
|
|
buggy_delta = wakeup_utc_mins - ref_as_utc # 197 - 240 = -43
|
|
print(f"\n[BUGGY SCENARIO]")
|
|
print(f"Backend returns (wrong) delta: {buggy_delta}")
|
|
|
|
# Frontend receives -43 and tries to adjust it.
|
|
# offsetFromRef = (received_delta - offset) - ref_mins_local
|
|
# wait, the logic was: localMins = (received + abs(offset)).
|
|
# Let's follow the code exactly:
|
|
# adjustForTimezone(delta) = delta - offset_in_minutes
|
|
# (Wait, if the component thinks 'delta' is absolute minutes from midnight?)
|
|
# The user said: "Render the Wakeup Times given -43 as value ... results to 01:17"
|
|
# Let's see how to get 01:17 from -43 and ref 04:00.
|
|
# 240 (ref) - 163 = 77? No.
|
|
# If offsetFromRef is -163: formatMinutesAfter(-163, "04:00") -> 240 - 163 = 77 (01:17).
|
|
# How do we get -163 from -43?
|
|
# -43 - 120 = -163. (Ah! It's subtracting the absolute offset instead of handling sign).
|
|
# Or: -43 + (-120) = -163.
|
|
# This happens if the code does: delta + offset_in_minutes (where offset is -120).
|
|
# Wait, if offset is -120: -43 + (-120) = -163.
|
|
# So the component is doing: localMins = delta + offset_in_minutes.
|
|
# Then offsetFromRef = localMins - ref_mins = (-163) - 240 = -403? No.
|
|
# Let's check component:
|
|
# offsetFromRef = getLocalOffsetFromReference(day.wakeup_minutes, wakeup_ref);
|
|
# which is: (wakeup_minutes - offsetInMinutes) - ref_mins.
|
|
# If wakeup_minutes = -43 and offsetInMinutes = 120 (if sign is flipped):
|
|
# (-43 - 120) - 240 = -163 - 240 = -403.
|
|
# If offsetInMinutes = -120:
|
|
# (-43 - (-120)) - 240 = (77) - 240 = -163.
|
|
# YES! That's exactly it.
|
|
# (-43 - (-120)) - 240 = -163.
|
|
# formatMinutesAfter(-163, "04:00") -> 240 + (-163) = 77.
|
|
# 77 minutes is 01:17. Correct!
|
|
|
|
def buggy_frontend(delta, ref_mins, offset):
|
|
local_m = delta - offset
|
|
return local_m - ref_mins
|
|
|
|
buggy_offset_from_ref = buggy_frontend(buggy_delta, local_ref_mins, offset_in_minutes)
|
|
print(f"BUGGY Frontend offsetFromRef: {buggy_offset_from_ref}")
|
|
print(f"BUGGY Frontend Display: {local_ref_mins + buggy_offset_from_ref} (Minutes from midnight)")
|
|
|
|
# --- SCENARIO 2: THE FIXED WAY (My proposed plan) ---
|
|
# 1. Frontend converts local ref "04:00" to UTC "02:00".
|
|
# 2. Backend receives ref=120. Calculates delta = 197 - 120 = 77.
|
|
# 3. Frontend receives delta=77 and uses it DIRECTLY as offsetFromRef.
|
|
|
|
correct_delta = wakeup_utc_mins - (local_ref_mins + offset_in_minutes)
|
|
print(f"\n[FIXED SCENARIO]")
|
|
print(f"Backend returns (correct) delta: {correct_delta}")
|
|
|
|
# Frontend uses it directly.
|
|
fixed_offset_from_ref = correct_delta
|
|
print(f"FIXED Frontend offsetFromRef: {fixed_offset_from_ref}")
|
|
print(f"FIXED Frontend Display: {local_ref_mins + fixed_offset_from_ref} (Minutes from midnight)")
|
|
|
|
# ASSERT
|
|
expected_mins = 5 * 60 + 17 # 317
|
|
actual_mins = local_ref_mins + fixed_offset_from_ref
|
|
print(f"\nASSERTION: Expected {expected_mins}, Actual {actual_mins}")
|
|
if actual_mins == expected_mins:
|
|
print("SUCCESS!")
|
|
else:
|
|
print("FAILURE!")
|
|
|
|
solve()
|