From: Dirk Eddelbuettel <edd@debian.org>
Date: Oct, 26 2026 00:41:34 -0500
Subject: [PATCH] Use SOURCE_DATE_EPOCH if set

File R/buildModel.R contains two sets of two lines where Sys.time() encodes 
build time. Reflecting (arbitrary) build time gets in the way of reproducible
builds so we now use SOURCE_DATE_EPOCH instead (if it is set).

--- r-cran-quantmod-0.4.29.orig/R/buildModel.R
+++ r-cran-quantmod-0.4.29/R/buildModel.R
@@ -10,9 +10,9 @@ function(x,FUN,subset,...) {
 
     x@fitted.model <- mcall$fitted
     x@model.inputs <- as.character(mcall$inputs)
-    x@build.date = as.character(Sys.time())
+    x@build.date <- as.character(as.POSIXct(if (nzchar(t <- Sys.getenv("SOURCE_DATE_EPOCH"))) as.numeric(t) else Sys.time(), tz = "UTC"))
     x@model.id <- paste(class(mcall$fitted)[length(class(mcall$fitted))],
-                               as.numeric(Sys.time()),sep='')
+                               as.numeric(if (nzchar(t <- Sys.getenv("SOURCE_DATE_EPOCH"))) t else Sys.time()),sep='')
     x@training.data <- index(training.data)
     invisible(x)
 }
@@ -47,9 +47,9 @@ function(x,method,training.per,...) {
     mcall <- do.call(method,list(quantmod=x,training.data=training.data, ...));
     x@fitted.model <- mcall$fitted;
     x@model.inputs <- as.character(mcall$inputs);
-    x@build.date = as.character(Sys.time());
+    x@build.date <- as.character(as.POSIXct(if (nzchar(t <- Sys.getenv("SOURCE_DATE_EPOCH"))) as.numeric(t) else Sys.time(), tz = "UTC"))
     x@model.id <- paste(class(mcall$fitted)[length(class(mcall$fitted))],
-                               as.numeric(Sys.time()),sep='');
+                               as.numeric(if (nzchar(t <- Sys.getenv("SOURCE_DATE_EPOCH"))) t else Sys.time()),sep='');
     x@training.data <- (training.dates);
     invisible(x);
 }
