From 4193e8814ac95f94189c6e6aa2b14b6bbbc8c646 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 10 Oct 2026 20:19:10 +0200 Subject: [PATCH] Fix start date of date ranges for instances in time zones with negative UTC offset --- .../calculator/roai/portfolio-calculator.spec.ts | 13 ++++++++----- apps/api/src/app/portfolio/portfolio.service.ts | 10 ++++++++-- libs/common/src/lib/calculation-helper.spec.ts | 6 ++++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts index 9e0fbc701f..c2779c2c14 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts @@ -190,6 +190,10 @@ describe('PortfolioCalculator', () => { }); describe('get performance', () => { + afterEach(() => { + jest.useRealTimers(); + }); + it('with a calendar year date range', async () => { const snapshot = await portfolioCalculator.getSnapshot(); @@ -242,13 +246,14 @@ describe('PortfolioCalculator', () => { netPerformance: 10 }), getHistoricalDataItem({ - date: '2017-01-03', + date: '2017-01-01', investment: 100, netPerformance: 20 }) ]; - jest.useFakeTimers().setSystemTime(new Date('2017-01-04T02:30:00.000Z')); + // 1 January 2017, 10:00 in New York + jest.useFakeTimers().setSystemTime(new Date('2017-01-01T15:00:00.000Z')); const { endDate, startDate } = getIntervalFromDateRange({ dateRange: 'ytd' @@ -259,13 +264,11 @@ describe('PortfolioCalculator', () => { start: startDate }); - jest.useRealTimers(); - expect( chart.map(({ date }) => { return date; }) - ).toEqual(['2016-12-31', '2017-01-03']); + ).toEqual(['2016-12-31', '2017-01-01']); }); }); }); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 6e9f8c045a..ab2c0de2d4 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -47,6 +47,7 @@ import { isAccountExcluded, isDraftActivity, parseDate, + resetHours, resolveUserSettings } from '@ghostfolio/common/helper'; import { @@ -559,8 +560,13 @@ export class PortfolioService { const { historicalData } = await portfolioCalculator.getSnapshot(); - const items = historicalData.filter(({ date }) => { - return !isBefore(date, startDate) && !isAfter(date, endDate); + const items = historicalData.filter((historicalDataItem) => { + const date = resetHours(parseDate(historicalDataItem.date)); + + return ( + !isBefore(date, resetHours(startDate)) && + !isAfter(date, resetHours(endDate)) + ); }); let investments: InvestmentItem[]; diff --git a/libs/common/src/lib/calculation-helper.spec.ts b/libs/common/src/lib/calculation-helper.spec.ts index a16e487431..7924d72544 100644 --- a/libs/common/src/lib/calculation-helper.spec.ts +++ b/libs/common/src/lib/calculation-helper.spec.ts @@ -10,6 +10,10 @@ import { DateRange } from './types'; describe('CalculationHelper', () => { describe('interval from date range', () => { + afterEach(() => { + jest.useRealTimers(); + }); + it('Get interval of a calendar year', async () => { const { endDate, startDate } = getIntervalFromDateRange({ dateRange: '2024' @@ -42,8 +46,6 @@ describe('CalculationHelper', () => { new Date(2023, 9, 10), new Date(2019, 9, 10) ]); - - jest.useRealTimers(); }); });