diff --git a/backend/package-lock.json b/backend/package-lock.json index 86fe7b3..a80fdbb 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -13,6 +13,7 @@ "dotenv": "^16.4.7", "express": "^4.19.2", "googleapis": "^171.0.0", + "luxon": "^3.7.2", "mongoose": "^8.9.0", "multer": "^1.4.5-lts.1" } @@ -1273,6 +1274,15 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", diff --git a/backend/package.json b/backend/package.json index 1c5e245..7b368c3 100644 --- a/backend/package.json +++ b/backend/package.json @@ -16,6 +16,7 @@ "dotenv": "^16.4.7", "express": "^4.19.2", "googleapis": "^171.0.0", + "luxon": "^3.7.2", "mongoose": "^8.9.0", "multer": "^1.4.5-lts.1" } diff --git a/backend/routes/bible.js b/backend/routes/bible.js index cf88017..967c52b 100644 --- a/backend/routes/bible.js +++ b/backend/routes/bible.js @@ -1,8 +1,12 @@ const express = require("express"); +const { DateTime } = require("luxon"); const BibleVerse = require("../models/BibleVerse"); const router = express.Router(); +// Korea Standard Time zone +const KST_TIMEZONE = "Asia/Seoul"; + const pickRandomVerse = async (filter) => { const results = await BibleVerse.aggregate([ { $match: filter }, @@ -13,7 +17,9 @@ const pickRandomVerse = async (filter) => { router.get("/today", async (req, res) => { try { - const targetDate = req.query.date || new Date().toISOString().slice(0, 10); + // Get today's date in KST (YYYY-MM-DD format) + const todayKst = DateTime.now().setZone(KST_TIMEZONE).toISODate(); + const targetDate = req.query.date || todayKst; const datedVerse = await pickRandomVerse({ active: true, date: targetDate, diff --git a/backend/routes/schedules.js b/backend/routes/schedules.js index 3ac46fc..ad12605 100644 --- a/backend/routes/schedules.js +++ b/backend/routes/schedules.js @@ -1,31 +1,35 @@ const express = require("express"); +const { DateTime } = require("luxon"); const Schedule = require("../models/Schedule"); const router = express.Router(); -const startOfWeek = (date = new Date()) => { - const copy = new Date(date); - const day = copy.getDay(); - const diff = day === 0 ? -6 : 1 - day; - copy.setDate(copy.getDate() + diff); - copy.setHours(0, 0, 0, 0); - return copy; +// Korea Standard Time zone +const KST_TIMEZONE = "Asia/Seoul"; + +const startOfWeek = () => { + // Get current time in KST and find the start of the week (Monday) + const nowKst = DateTime.now().setZone(KST_TIMEZONE); + // Luxon uses 1 = Monday, 7 = Sunday + const startOfWeekKst = nowKst.startOf("week"); // Monday 00:00:00.000 + return startOfWeekKst.toJSDate(); }; -const endOfWeek = (date = new Date()) => { - const start = startOfWeek(date); - const end = new Date(start); - end.setDate(end.getDate() + 6); - end.setHours(23, 59, 59, 999); - return end; +const endOfWeek = () => { + // Get current time in KST and find the end of the week (Sunday) + const nowKst = DateTime.now().setZone(KST_TIMEZONE); + const endOfWeekKst = nowKst.endOf("week"); // Sunday 23:59:59.999 + return endOfWeekKst.toJSDate(); }; -const startOfMonth = (date = new Date()) => { - return new Date(date.getFullYear(), date.getMonth(), 1, 0, 0, 0, 0); +const startOfMonth = () => { + const nowKst = DateTime.now().setZone(KST_TIMEZONE); + return nowKst.startOf("month").toJSDate(); }; -const endOfMonth = (date = new Date()) => { - return new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999); +const endOfMonth = () => { + const nowKst = DateTime.now().setZone(KST_TIMEZONE); + return nowKst.endOf("month").toJSDate(); }; router.get("/", async (req, res) => { diff --git a/backend/routes/todos.js b/backend/routes/todos.js index 0b8141f..2a1a028 100644 --- a/backend/routes/todos.js +++ b/backend/routes/todos.js @@ -1,27 +1,26 @@ const express = require("express"); +const { DateTime } = require("luxon"); const Todo = require("../models/Todo"); const router = express.Router(); -// Get day range in Korea Standard Time (UTC+9) +// Korea Standard Time zone +const KST_TIMEZONE = "Asia/Seoul"; + +// Get day range in Korea Standard Time (Asia/Seoul) const getDayRange = () => { - const now = new Date(); - // Get current time in KST (UTC+9) - const kstOffset = 9 * 60; // minutes - const utcTime = now.getTime() + (now.getTimezoneOffset() * 60000); - const kstTime = new Date(utcTime + (kstOffset * 60000)); + // Get current time in KST + const nowKst = DateTime.now().setZone(KST_TIMEZONE); - // Start of day in KST - const startKst = new Date(kstTime); - startKst.setHours(0, 0, 0, 0); + // Start of day in KST (00:00:00.000) + const startOfDayKst = nowKst.startOf("day"); - // End of day in KST - const endKst = new Date(kstTime); - endKst.setHours(23, 59, 59, 999); + // End of day in KST (23:59:59.999) + const endOfDayKst = nowKst.endOf("day"); - // Convert back to UTC for MongoDB query - const start = new Date(startKst.getTime() - (kstOffset * 60000)); - const end = new Date(endKst.getTime() - (kstOffset * 60000)); + // Convert to JavaScript Date objects (UTC) for MongoDB query + const start = startOfDayKst.toJSDate(); + const end = endOfDayKst.toJSDate(); return { start, end }; }; diff --git a/flutter_app/lib/services/todo_service.dart b/flutter_app/lib/services/todo_service.dart index 6e663fa..aabccfd 100644 --- a/flutter_app/lib/services/todo_service.dart +++ b/flutter_app/lib/services/todo_service.dart @@ -20,6 +20,7 @@ class TodoService { Future> fetchTodayTodos() async { if (ApiConfig.useMockData) { + // Using device's local timezone (should be Asia/Seoul for Korean users) final now = DateTime.now(); final today = DateTime(now.year, now.month, now.day); final tomorrow = today.add(const Duration(days: 1));