From 8498888a589df9c685514bf728aad90bd56eb243 Mon Sep 17 00:00:00 2001 From: Kannan Date: Wed, 24 Jun 2026 11:21:52 +0530 Subject: [PATCH] fix: display booking times in IST instead of UTC in emails and notifications - Replace hardcoded timeZone: UTC with Asia/Kolkata in sendBookingConfirmation and sendBookingCancelled (email.service.ts) - Replace bare date-fns format() calls (server-local timezone) with Intl toLocaleString IST-aware formatting in mentor-booking.service.ts - Append IST label to all user-facing date strings for clarity - Remove unused `format` import from date-fns Fixes booking confirmation and cancellation emails showing wrong time (e.g. 3:30 AM instead of 9:00 AM IST for IST-scheduled sessions) --- .../src/infrastructure/email/email.service.ts | 32 +++++++++++-------- .../services/mentor/mentor-booking.service.ts | 14 ++++++-- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/backend/src/infrastructure/email/email.service.ts b/backend/src/infrastructure/email/email.service.ts index 5fca0f6..83f744f 100644 --- a/backend/src/infrastructure/email/email.service.ts +++ b/backend/src/infrastructure/email/email.service.ts @@ -96,15 +96,16 @@ export class EmailService implements IEmailService { } async sendBookingConfirmation(data: BookingConfirmationEmailData): Promise { - const startFormatted = data.startTime.toLocaleString('en-US', { - timeZone: 'UTC', - weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', - hour: '2-digit', minute: '2-digit', - }); - const endFormatted = data.endTime.toLocaleString('en-US', { - timeZone: 'UTC', - hour: '2-digit', minute: '2-digit', - }); + const formatIST = (date: Date, opts: Intl.DateTimeFormatOptions): string => + date.toLocaleString('en-IN', { timeZone: 'Asia/Kolkata', ...opts }); + + const startFormatted = + formatIST(data.startTime, { + weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', + hour: '2-digit', minute: '2-digit', + }) + ' IST'; + const endFormatted = + formatIST(data.endTime, { hour: '2-digit', minute: '2-digit' }) + ' IST'; try { await this._transporter.sendMail({ @@ -134,11 +135,14 @@ export class EmailService implements IEmailService { } async sendBookingCancelled(data: BookingCancelledEmailData): Promise { - const startFormatted = data.startTime.toLocaleString('en-US', { - timeZone: 'UTC', - weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', - hour: '2-digit', minute: '2-digit', - }); + const formatIST = (date: Date, opts: Intl.DateTimeFormatOptions): string => + date.toLocaleString('en-IN', { timeZone: 'Asia/Kolkata', ...opts }); + + const startFormatted = + formatIST(data.startTime, { + weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', + hour: '2-digit', minute: '2-digit', + }) + ' IST'; try { await this._transporter.sendMail({ diff --git a/backend/src/services/mentor/mentor-booking.service.ts b/backend/src/services/mentor/mentor-booking.service.ts index f49574c..f4ac2f3 100644 --- a/backend/src/services/mentor/mentor-booking.service.ts +++ b/backend/src/services/mentor/mentor-booking.service.ts @@ -1,4 +1,4 @@ -import { isAfter, differenceInHours, format } from 'date-fns'; +import { isAfter, differenceInHours } from 'date-fns'; import { IMentorBookingService, MentorDashboardStats } from '../../interfaces/service-interfaces/mentor/IMentorBookingService'; import { Types } from 'mongoose'; import { IMentorBookingRepository } from '../../interfaces/repository-interfaces/mentor/IMentorBookingRepository'; @@ -130,7 +130,11 @@ export class MentorBookingService implements IMentorBookingService { } const bookingId = (booking._id as { toString(): string }).toString(); - const formattedTime = format(startTime, 'MMM d, yyyy \'at\' h:mm a'); + const formattedTime = startTime.toLocaleString('en-IN', { + timeZone: 'Asia/Kolkata', + month: 'short', day: 'numeric', year: 'numeric', + hour: 'numeric', minute: '2-digit', + }) + ' IST'; // Candidate: "Your session is confirmed" void this.notificationService.create({ @@ -192,7 +196,11 @@ export class MentorBookingService implements IMentorBookingService { return; } - const formattedTime = format(booking.startTime, 'MMM d, yyyy \'at\' h:mm a'); + const formattedTime = booking.startTime.toLocaleString('en-IN', { + timeZone: 'Asia/Kolkata', + month: 'short', day: 'numeric', year: 'numeric', + hour: 'numeric', minute: '2-digit', + }) + ' IST'; const cancelledByName = cancelledBy.fullName; const sharedData = {