From 57b7891e75cc5b069954e4545a71c7f78697852e Mon Sep 17 00:00:00 2001 From: Brendan Jurd Date: Fri, 11 Mar 2022 11:51:38 +1100 Subject: unitconvert: round to nearest date when converting to yyyymmdd. This resolves an issue where converting from a low-precision decimalyear to yyyymmdd gave the wrong result, due to mjd_to_yyyymmdd() truncating away the fractional time component. This commit changes the behaviour of mjd_to_yyyymmdd() to round to the nearest date, instead of truncating. Refs #1483 --- src/conversions/unitconvert.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/conversions/unitconvert.cpp b/src/conversions/unitconvert.cpp index d584d93f..5a5042f0 100644 --- a/src/conversions/unitconvert.cpp +++ b/src/conversions/unitconvert.cpp @@ -252,21 +252,22 @@ static double yyyymmdd_to_mjd(double yyyymmdd) { /***********************************************************************/ static double mjd_to_yyyymmdd(double mjd) { /************************************************************************ - Date given in YYYY-MM-DD format. + Date returned in YYYY-MM-DD format. ************************************************************************/ - double mjd_iter = 14 + 31; - int year = 1859, month=0, day=0; + unsigned int mjd_iter = 14 + 31; + unsigned int year = 1859, month = 0, day = 0; + unsigned int date = (int) lround(mjd); - for (; mjd >= mjd_iter; year++) { + for (; date >= mjd_iter; year++) { mjd_iter += days_in_year(year); } year--; mjd_iter -= days_in_year(year); - for (month=1; mjd_iter + days_in_month(year, month) <= mjd; month++) + for (month=1; mjd_iter + days_in_month(year, month) <= date; month++) mjd_iter += days_in_month(year, month); - day = (int)(mjd - mjd_iter + 1); + day = date - mjd_iter + 1; return year*10000.0 + month*100.0 + day; } -- cgit v1.2.3 From f04faeae6c9d3864362816db9b95968e54f95dc4 Mon Sep 17 00:00:00 2001 From: Brendan Jurd Date: Fri, 11 Mar 2022 23:56:58 +1100 Subject: Rename variable per PR feedback on #3111. --- src/conversions/unitconvert.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/conversions/unitconvert.cpp b/src/conversions/unitconvert.cpp index 5a5042f0..991eb2e0 100644 --- a/src/conversions/unitconvert.cpp +++ b/src/conversions/unitconvert.cpp @@ -254,20 +254,20 @@ static double mjd_to_yyyymmdd(double mjd) { /************************************************************************ Date returned in YYYY-MM-DD format. ************************************************************************/ - unsigned int mjd_iter = 14 + 31; + unsigned int date_iter = 14 + 31; unsigned int year = 1859, month = 0, day = 0; unsigned int date = (int) lround(mjd); - for (; date >= mjd_iter; year++) { - mjd_iter += days_in_year(year); + for (; date >= date_iter; year++) { + date_iter += days_in_year(year); } year--; - mjd_iter -= days_in_year(year); + date_iter -= days_in_year(year); - for (month=1; mjd_iter + days_in_month(year, month) <= date; month++) - mjd_iter += days_in_month(year, month); + for (month=1; date_iter + days_in_month(year, month) <= date; month++) + date_iter += days_in_month(year, month); - day = date - mjd_iter + 1; + day = date - date_iter + 1; return year*10000.0 + month*100.0 + day; } -- cgit v1.2.3