--- compiler/globals.pas 2020-01-26 11:40:37.848057995 +0100 +++ compiler/globals.pas 2020-01-26 11:40:31.014043335 +0100 @@ -559,8 +559,9 @@ startsystime : TSystemTime; function getdatestr:string; function gettimestr:string; + Function UnixToDateTime(const AValue: Int64): TDateTime; function filetimestring( t : longint) : string; function getrealtime(const st: TSystemTime) : real; function getrealtime : real; @@ -816,13 +817,34 @@ get the current date in a string YY/MM/DD } var st: TSystemTime; + Year, Month, Day: Word; + SourceDateEpoch: string; begin - GetLocalTime(st); - getdatestr:=L0(st.Year)+'/'+L0(st.Month)+'/'+L0(st.Day); - end; - + SourceDateEpoch := GetEnvironmentVariable('SOURCE_DATE_EPOCH'); + if Length(SourceDateEpoch)>0 then begin + DecodeDate(UnixToDateTime(StrToInt64(SourceDateEpoch)),year,month,day); + getdatestr:=L0(Year)+'/'+L0(Month)+'/'+L0(Day) + end else begin + GetLocalTime(st); + getdatestr:=L0(st.Year)+'/'+L0(st.Month)+'/'+L0(st.Day) + end + end; + + Function UnixToDateTime(const AValue: Int64): TDateTime; + { Code copied from fpcsrc/packages/rtl-objpas/src/inc/dateutil.inc and + fpcsrc/rtl/objpas/sysutils/datih.inc } + const + TDateTimeEpsilon = 2.2204460493e-16 ; + UnixEpoch = TDateTime(-2415018.5) + TDateTime(2440587.5) ; + begin + Result:=UnixEpoch + AValue/SecsPerDay; + if (UnixEpoch>=0) and (Result<-TDateTimeEpsilon) then + Result:=int(Result-1.0+TDateTimeEpsilon)-frac(1.0+frac(Result)) + // else if (UnixEpoch<=-1.0) and (Result>-1.0+TDateTimeEpsilon) then + // Result:=int(Result+1.0-TDateTimeEpsilon)+frac(1.0-abs(frac(1.0+Result))); + end; function filetimestring( t : longint) : string; { convert dos datetime t to a string YY/MM/DD HH:MM:SS