Skip to content

Commit

Permalink
Merge pull request #27838 from abzokhattab/fixing-incorrect-timezone-…
Browse files Browse the repository at this point in the history
…shown-in-messages

Fixing incorrect message timing display when changing timezones
  • Loading branch information
johnmlee101 authored Sep 26, 2023
2 parents e14e9ee + 114e047 commit 44568ba
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 7 deletions.
55 changes: 49 additions & 6 deletions src/libs/DateUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@ import {es, enGB} from 'date-fns/locale';
import {
formatDistanceToNow,
subMinutes,
addDays,
subDays,
isBefore,
subMilliseconds,
isToday,
isTomorrow,
isYesterday,
startOfWeek,
endOfWeek,
format,
Expand Down Expand Up @@ -85,6 +84,47 @@ function getLocalDateFromDatetime(locale, datetime, currentSelectedTimezone = ti
return utcToZonedTime(parsedDatetime, currentSelectedTimezone);
}

/**
* Checks if a given date is today in the specified time zone.
*
* @param {Date} date - The date to compare.
* @param {String} timeZone - The time zone to consider.
* @returns {Boolean} True if the date is today; otherwise, false.
*/
function isToday(date, timeZone) {
const currentDate = new Date();
const currentDateInTimeZone = utcToZonedTime(currentDate, timeZone);
return isSameDay(date, currentDateInTimeZone);
}

/**
* Checks if a given date is tomorrow in the specified time zone.
*
* @param {Date} date - The date to compare.
* @param {String} timeZone - The time zone to consider.
* @returns {Boolean} True if the date is tomorrow; otherwise, false.
*/
function isTomorrow(date, timeZone) {
const currentDate = new Date();
const tomorrow = addDays(currentDate, 1); // Get the date for tomorrow in the current time zone
const tomorrowInTimeZone = utcToZonedTime(tomorrow, timeZone);
return isSameDay(date, tomorrowInTimeZone);
}

/**
* Checks if a given date is yesterday in the specified time zone.
*
* @param {Date} date - The date to compare.
* @param {String} timeZone - The time zone to consider.
* @returns {Boolean} True if the date is yesterday; otherwise, false.
*/
function isYesterday(date, timeZone) {
const currentDate = new Date();
const yesterday = subDays(currentDate, 1); // Get the date for yesterday in the current time zone
const yesterdayInTimeZone = utcToZonedTime(yesterday, timeZone);
return isSameDay(date, yesterdayInTimeZone);
}

/**
* Formats an ISO-formatted datetime string to local date and time string
*
Expand Down Expand Up @@ -117,13 +157,13 @@ function datetimeToCalendarTime(locale, datetime, includeTimeZone = false, curre
yesterdayAt = yesterdayAt.toLowerCase();
}

if (isToday(date)) {
if (isToday(date, currentSelectedTimezone)) {
return `${todayAt} ${format(date, CONST.DATE.LOCAL_TIME_FORMAT)}${tz}`;
}
if (isTomorrow(date)) {
if (isTomorrow(date, currentSelectedTimezone)) {
return `${tomorrowAt} ${format(date, CONST.DATE.LOCAL_TIME_FORMAT)}${tz}`;
}
if (isYesterday(date)) {
if (isYesterday(date, currentSelectedTimezone)) {
return `${yesterdayAt} ${format(date, CONST.DATE.LOCAL_TIME_FORMAT)}${tz}`;
}
if (date >= startOfCurrentWeek && date <= endOfCurrentWeek) {
Expand Down Expand Up @@ -346,6 +386,9 @@ const DateUtils = {
subtractMillisecondsFromDateTime,
getDateStringFromISOTimestamp,
getStatusUntilDate,
isToday,
isTomorrow,
isYesterday,
};

export default DateUtils;
30 changes: 29 additions & 1 deletion tests/unit/DateUtilsTest.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Onyx from 'react-native-onyx';
import {format as tzFormat} from 'date-fns-tz';
import {format as tzFormat, utcToZonedTime} from 'date-fns-tz';
import {addMinutes, subHours, subMinutes, subSeconds, format, setMinutes, setHours, subDays, addDays} from 'date-fns';
import CONST from '../../src/CONST';
import DateUtils from '../../src/libs/DateUtils';
Expand Down Expand Up @@ -130,6 +130,34 @@ describe('DateUtils', () => {
expect(result).toBe(expectedDateTime);
});

describe('Date Comparison Functions', () => {
const today = new Date();
const tomorrow = addDays(today, 1);
const yesterday = subDays(today, 1);

const todayInTimezone = utcToZonedTime(today, timezone);
const tomorrowInTimezone = utcToZonedTime(tomorrow, timezone);
const yesterdayInTimezone = utcToZonedTime(yesterday, timezone);

it('isToday should correctly identify today', () => {
expect(DateUtils.isToday(todayInTimezone, timezone)).toBe(true);
expect(DateUtils.isToday(tomorrowInTimezone, timezone)).toBe(false);
expect(DateUtils.isToday(yesterdayInTimezone, timezone)).toBe(false);
});

it('isTomorrow should correctly identify tomorrow', () => {
expect(DateUtils.isTomorrow(tomorrowInTimezone, timezone)).toBe(true);
expect(DateUtils.isTomorrow(todayInTimezone, timezone)).toBe(false);
expect(DateUtils.isTomorrow(yesterdayInTimezone, timezone)).toBe(false);
});

it('isYesterday should correctly identify yesterday', () => {
expect(DateUtils.isYesterday(yesterdayInTimezone, timezone)).toBe(true);
expect(DateUtils.isYesterday(todayInTimezone, timezone)).toBe(false);
expect(DateUtils.isYesterday(tomorrowInTimezone, timezone)).toBe(false);
});
});

describe('getDBTime', () => {
it('should return the date in the format expected by the database', () => {
const getDBTime = DateUtils.getDBTime();
Expand Down

0 comments on commit 44568ba

Please sign in to comment.