aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrendan Jurd <brendan.jurd@geoplex.com.au>2022-03-11 11:51:38 +1100
committerBrendan Jurd <brendan.jurd@geoplex.com.au>2022-03-11 14:33:34 +1100
commit57b7891e75cc5b069954e4545a71c7f78697852e (patch)
tree46e534a3b7ffab9f878289a327fae77d01eca812 /src
parent6d00538de1a1d7da04619fdebfcbd5a16ba07a9f (diff)
downloadPROJ-57b7891e75cc5b069954e4545a71c7f78697852e.tar.gz
PROJ-57b7891e75cc5b069954e4545a71c7f78697852e.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/conversions/unitconvert.cpp13
1 files changed, 7 insertions, 6 deletions
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;
}