diff --git a/swad_RSS.c b/swad_RSS.c
index 775eef42..a90048e9 100644
--- a/swad_RSS.c
+++ b/swad_RSS.c
@@ -63,6 +63,7 @@ void RSS_UpdateRSSFileForACrs (struct Crs_Course *Crs)
FILE *FileRSS;
char RSSLink[Cns_MAX_BYTES_WWW + 1];
struct tm *tm;
+ time_t t = Dat_GetStartExecutionTimeUTC ();
/***** Create RSS directory if not exists *****/
snprintf (PathRelPublRSSDir,sizeof (PathRelPublRSSDir),"%s/%ld/%s",
@@ -111,12 +112,12 @@ void RSS_UpdateRSSFileForACrs (struct Crs_Course *Crs)
// All date-times in RSS conform to the Date and Time Specification of RFC 822, with the exception that the year may be expressed with two characters or four characters (four preferred)
fprintf (FileRSS,"");
- tm = gmtime (&Gbl.StartExecutionTimeUTC);
+ tm = gmtime (&t);
Dat_WriteRFC822DateFromTM (FileRSS,tm);
fprintf (FileRSS,"\n");
fprintf (FileRSS,"");
- tm = gmtime (&Gbl.StartExecutionTimeUTC);
+ tm = gmtime (&t);
Dat_WriteRFC822DateFromTM (FileRSS,tm);
fprintf (FileRSS,"\n");
diff --git a/swad_agenda.c b/swad_agenda.c
index 16482d26..0b3c7dc8 100644
--- a/swad_agenda.c
+++ b/swad_agenda.c
@@ -1407,8 +1407,8 @@ void Agd_RequestCreatOrEditEvent (void)
{
/* Initialize to empty event */
AgdEvent.AgdCod = -1L;
- AgdEvent.TimeUTC[Dat_STR_TIME] = Gbl.StartExecutionTimeUTC;
- AgdEvent.TimeUTC[Dat_END_TIME] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours
+ AgdEvent.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
+ AgdEvent.TimeUTC[Dat_END_TIME] = AgdEvent.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours
AgdEvent.TimeStatus = Dat_FUTURE;
AgdEvent.Event[0] = '\0';
AgdEvent.Location[0] = '\0';
@@ -1562,7 +1562,7 @@ void Agd_ReceiveFormEvent (void)
/***** Adjust dates *****/
if (AgdEvent.TimeUTC[Dat_STR_TIME] == 0)
- AgdEvent.TimeUTC[Dat_STR_TIME] = Gbl.StartExecutionTimeUTC;
+ AgdEvent.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
if (AgdEvent.TimeUTC[Dat_END_TIME] == 0)
AgdEvent.TimeUTC[Dat_END_TIME] = AgdEvent.TimeUTC[Dat_STR_TIME] + 2 * 60 * 60; // +2 hours
diff --git a/swad_assignment.c b/swad_assignment.c
index bc84ef97..6ca6b94a 100644
--- a/swad_assignment.c
+++ b/swad_assignment.c
@@ -1210,8 +1210,8 @@ void Asg_RequestCreatOrEditAsg (void)
{
/* Initialize to empty assignment */
Assignments.Asg.AsgCod = -1L;
- Assignments.Asg.TimeUTC[Dat_STR_TIME] = Gbl.StartExecutionTimeUTC;
- Assignments.Asg.TimeUTC[Dat_END_TIME] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours
+ Assignments.Asg.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
+ Assignments.Asg.TimeUTC[Dat_END_TIME] = Assignments.Asg.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours
Assignments.Asg.Open = true;
Assignments.Asg.Title[0] = '\0';
Assignments.Asg.SendWork = Asg_DO_NOT_SEND_WORK;
@@ -1454,7 +1454,7 @@ void Asg_ReceiveFormAssignment (void)
/***** Adjust dates *****/
if (Assignments.Asg.TimeUTC[Dat_STR_TIME] == 0)
- Assignments.Asg.TimeUTC[Dat_STR_TIME] = Gbl.StartExecutionTimeUTC;
+ Assignments.Asg.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
if (Assignments.Asg.TimeUTC[Dat_END_TIME] == 0)
Assignments.Asg.TimeUTC[Dat_END_TIME] = Assignments.Asg.TimeUTC[Dat_STR_TIME] + 2 * 60 * 60; // +2 hours
diff --git a/swad_attendance.c b/swad_attendance.c
index 65b1481f..3edc9a14 100644
--- a/swad_attendance.c
+++ b/swad_attendance.c
@@ -1010,8 +1010,8 @@ void Att_RequestCreatOrEditAttEvent (void)
/* Initialize some fields */
Events.Event.CrsCod = Gbl.Hierarchy.Crs.CrsCod;
Events.Event.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
- Events.Event.TimeUTC[Dat_STR_TIME] = Gbl.StartExecutionTimeUTC;
- Events.Event.TimeUTC[Dat_END_TIME] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours
+ Events.Event.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
+ Events.Event.TimeUTC[Dat_END_TIME] = Events.Event.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours
Events.Event.Open = true;
}
else
@@ -1230,7 +1230,7 @@ void Att_ReceiveFormAttEvent (void)
/***** Adjust dates *****/
if (ReceivedAtt.TimeUTC[Dat_STR_TIME] == 0)
- ReceivedAtt.TimeUTC[Dat_STR_TIME] = Gbl.StartExecutionTimeUTC;
+ ReceivedAtt.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
if (ReceivedAtt.TimeUTC[Dat_END_TIME] == 0)
ReceivedAtt.TimeUTC[Dat_END_TIME] = ReceivedAtt.TimeUTC[Dat_STR_TIME] + 2 * 60 * 60; // +2 hours // TODO: 2 * 60 * 60 should be in a #define in swad_config.h
diff --git a/swad_banner_database.c b/swad_banner_database.c
index 324ec9bb..3059a7db 100644
--- a/swad_banner_database.c
+++ b/swad_banner_database.c
@@ -93,7 +93,7 @@ unsigned Ban_DB_GetRandomBanners (MYSQL_RES **mysql_res)
" WHERE Hidden='N'"
" ORDER BY RAND(%lu)"
" LIMIT %u",
- (unsigned long) (Gbl.StartExecutionTimeUTC /
+ (unsigned long) (Dat_GetStartExecutionTimeUTC () /
Cfg_TIME_TO_CHANGE_BANNER),
Cfg_NUMBER_OF_BANNERS);
}
diff --git a/swad_browser.c b/swad_browser.c
index 92a5336b..cc1a5fd7 100644
--- a/swad_browser.c
+++ b/swad_browser.c
@@ -4482,7 +4482,7 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
/***** Check if is a recent file or folder *****/
// If less than a week since last modify ==> indicate the file is recent by writting its name in green
- if (Gbl.StartExecutionTimeUTC < FileMetadata.Time + (7L * 24L * 60L * 60L))
+ if (Dat_GetStartExecutionTimeUTC () < FileMetadata.Time + (7L * 24L * 60L * 60L))
IsRecent = true;
/* Style of the text in this row */
@@ -10318,7 +10318,7 @@ static void Brw_RemoveOldFilesInBrowser (unsigned Months,struct Brw_NumObjects *
/***** Compute time in seconds
(files older than this time will be removed) *****/
- TimeRemoveFilesOlder = Gbl.StartExecutionTimeUTC -
+ TimeRemoveFilesOlder = Dat_GetStartExecutionTimeUTC () -
(time_t) Months * Dat_SECONDS_IN_ONE_MONTH;
/***** Remove old files recursively *****/
diff --git a/swad_calendar.c b/swad_calendar.c
index 707ebf66..2ad9b31e 100644
--- a/swad_calendar.c
+++ b/swad_calendar.c
@@ -215,7 +215,7 @@ void Cal_DrawCurrentMonth (void)
HTM_Txt ("\tGbl_HTMLContent = '';");
HTM_TxtF ("\tDrawCurrentMonth ('CurrentMonth',%u,%ld,%ld,'%s','%s/%s',",
Gbl.Prefs.FirstDayOfWeek,
- (long) Gbl.StartExecutionTimeUTC,
+ (long) Dat_GetStartExecutionTimeUTC (),
Gbl.Hierarchy.Ctr.PlcCod,
The_GetSuffix (),
Cfg_URL_SWAD_CGI,Lan_STR_LANG_ID[Gbl.Prefs.Language]);
@@ -284,7 +284,7 @@ static void Cal_DrawCalendar (Act_Action_t ActionSeeCalendar,
HTM_Txt ("\tGbl_HTMLContent = '';");
HTM_TxtF ("\tCal_DrawCalendar('calendar',%u,%ld,%ld,%s,'%s','%s/%s',",
Gbl.Prefs.FirstDayOfWeek,
- (long) Gbl.StartExecutionTimeUTC,
+ (long) Dat_GetStartExecutionTimeUTC (),
Gbl.Hierarchy.Ctr.PlcCod,
PrintView ? "true" :
"false",
diff --git a/swad_call_for_exam.c b/swad_call_for_exam.c
index 320cb326..be8c7e71 100644
--- a/swad_call_for_exam.c
+++ b/swad_call_for_exam.c
@@ -195,9 +195,9 @@ static long Cfe_GetParamsCallsForExams (struct Cfe_CallsForExams *CallsForExams)
CallsForExams->CallForExam.ExamDate.Month == 0 ||
CallsForExams->CallForExam.ExamDate.Year == 0)
{
- CallsForExams->CallForExam.ExamDate.Day = Gbl.Now.Date.Day;
- CallsForExams->CallForExam.ExamDate.Month = Gbl.Now.Date.Month;
- CallsForExams->CallForExam.ExamDate.Year = Gbl.Now.Date.Year;
+ CallsForExams->CallForExam.ExamDate.Day = Dat_GetCurrentDay ();
+ CallsForExams->CallForExam.ExamDate.Month = Dat_GetCurrentMonth ();
+ CallsForExams->CallForExam.ExamDate.Year = Dat_GetCurrentYear ();
}
/***** Get the hour of the exam *****/
@@ -898,6 +898,7 @@ static void Cfe_ShowCallForExam (struct Cfe_CallsForExams *CallsForExams,
extern const char *Txt_Publish_call_FOR_EXAM;
struct Ins_Instit Ins;
char StrExamDate[Cns_MAX_BYTES_DATE + 1];
+ unsigned CurrentYear = Dat_GetCurrentYear ();
unsigned Year;
unsigned Hour;
unsigned Minute;
@@ -1103,9 +1104,9 @@ static void Cfe_ShowCallForExam (struct Cfe_CallsForExams *CallsForExams,
if (TypeViewCallForExam == Cfe_FORM_VIEW)
{
HTM_TD_Begin ("class=\"LB\"");
- Dat_WriteFormDate (CallsForExams->CallForExam.ExamDate.Year < Gbl.Now.Date.Year ? CallsForExams->CallForExam.ExamDate.Year :
- Gbl.Now.Date.Year,
- Gbl.Now.Date.Year + 1,"Exam",
+ Dat_WriteFormDate (CallsForExams->CallForExam.ExamDate.Year < CurrentYear ? CallsForExams->CallForExam.ExamDate.Year :
+ CurrentYear,
+ CurrentYear + 1,"Exam",
&(CallsForExams->CallForExam.ExamDate),
false,false);
HTM_TD_End ();
diff --git a/swad_changelog.h b/swad_changelog.h
index f8bcefc7..e93ab669 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -606,10 +606,11 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
TODO: Attach pdf files in multimedia.
*/
-#define Log_PLATFORM_VERSION "SWAD 22.49.9 (2022-10-18)"
+#define Log_PLATFORM_VERSION "SWAD 22.50 (2022-10-19)"
#define CSS_FILE "swad22.49.4.css"
#define JS_FILE "swad22.49.js"
/*
+ Version 22.50: Oct 19, 2022 Code refactoring related to dates. (333318 lines)
Version 22.49.9: Oct 18, 2022 Code refactoring related to XML. (333257 lines)
Version 22.49.8: Oct 18, 2022 Code refactoring related to parameters. (333253 lines)
Version 22.49.7: Oct 18, 2022 Code refactoring related to database. (333218 lines)
diff --git a/swad_connected.c b/swad_connected.c
index 26be3119..c7cfa010 100644
--- a/swad_connected.c
+++ b/swad_connected.c
@@ -113,7 +113,7 @@ void Con_ShowConnectedUsrs (void)
free (Title);
/***** Current time *****/
- Dat_WriteLocalDateHMSFromUTC ("connected_current_time",Gbl.StartExecutionTimeUTC,
+ Dat_WriteLocalDateHMSFromUTC ("connected_current_time",Dat_GetStartExecutionTimeUTC (),
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
false,false,true,0x7);
diff --git a/swad_cryptography.c b/swad_cryptography.c
index 13937886..4a1a010c 100644
--- a/swad_cryptography.c
+++ b/swad_cryptography.c
@@ -133,6 +133,6 @@ void Cry_CreateUniqueNameEncrypted (char UniqueNameEncrypted[Cry_BYTES_ENCRYPTED
NumCall++;
snprintf (UniqueNamePlain,sizeof (UniqueNamePlain),"%s-%lx-%x-%x",
- Gbl.IP,Gbl.StartExecutionTimeUTC,Gbl.PID,NumCall);
+ Gbl.IP,Dat_GetStartExecutionTimeUTC (),Gbl.PID,NumCall);
Cry_EncryptSHA256Base64 (UniqueNamePlain,UniqueNameEncrypted); // Make difficult to guess a unique name
}
diff --git a/swad_date.c b/swad_date.c
index f6973e15..a2e2db49 100644
--- a/swad_date.c
+++ b/swad_date.c
@@ -90,6 +90,20 @@ static const unsigned Dat_NumDaysMonth[1 + 12] =
[12] = 31, // December
};
+static struct
+ {
+ struct timeval tvStart;
+ struct timeval tvPageCreated;
+ time_t StartExecutionTimeUTC;
+ struct Dat_DateTime Now;
+ long TimeGenerationInMicroseconds;
+ long TimeSendInMicroseconds;
+ } Dat_Time =
+ {
+ .TimeGenerationInMicroseconds = 0L,
+ .TimeSendInMicroseconds = 0L,
+ };
+
/*****************************************************************************/
/**************************** Private prototypes *****************************/
/*****************************************************************************/
@@ -97,6 +111,138 @@ static const unsigned Dat_NumDaysMonth[1 + 12] =
static void Dat_PutIconsDateFormat (__attribute__((unused)) void *Args);
static unsigned Dat_GetParamDateFormat (void);
+/*****************************************************************************/
+/*********************** Set/get start execution time ************************/
+/*****************************************************************************/
+
+void Dat_SetStartExecutionTimeval (void)
+ {
+ struct timezone tz;
+
+ gettimeofday (&Dat_Time.tvStart, &tz);
+ }
+
+void Dat_SetStartExecutionTimeUTC (void)
+ {
+ Dat_Time.StartExecutionTimeUTC = time (NULL);
+ }
+
+time_t Dat_GetStartExecutionTimeUTC (void)
+ {
+ return Dat_Time.StartExecutionTimeUTC;
+ }
+
+struct Dat_Date *Dat_GetCurrentDate (void)
+ {
+ return &Dat_Time.Now.Date;
+ }
+
+unsigned Dat_GetCurrentDay (void)
+ {
+ return Dat_Time.Now.Date.Day;
+ }
+
+unsigned Dat_GetCurrentMonth (void)
+ {
+ return Dat_Time.Now.Date.Month;
+ }
+
+unsigned Dat_GetCurrentYear (void)
+ {
+ return Dat_Time.Now.Date.Year;
+ }
+
+/*****************************************************************************/
+/************** Get time to generate/send page in microseconds ***************/
+/*****************************************************************************/
+
+long Dat_GetTimeGenerationInMicroseconds (void)
+ {
+ return Dat_Time.TimeGenerationInMicroseconds;
+ }
+
+long Dat_GetTimeSendInMicroseconds (void)
+ {
+ return Dat_Time.TimeSendInMicroseconds;
+ }
+
+/*****************************************************************************/
+/**************** Compute the time used to generate the page *****************/
+/*****************************************************************************/
+
+void Dat_ComputeTimeToGeneratePage (void)
+ {
+ struct timezone tz;
+
+ if (gettimeofday (&Dat_Time.tvPageCreated, &tz))
+ // Error in gettimeofday
+ Dat_Time.TimeGenerationInMicroseconds = 0L;
+ else
+ Dat_Time.TimeGenerationInMicroseconds = (long) ((Dat_Time.tvPageCreated.tv_sec - Dat_Time.tvStart.tv_sec) * 1000000L +
+ Dat_Time.tvPageCreated.tv_usec - Dat_Time.tvStart.tv_usec);
+ }
+
+/*****************************************************************************/
+/****************** Compute the time used to send the page *******************/
+/*****************************************************************************/
+
+void Dat_ComputeTimeToSendPage (void)
+ {
+ struct timeval tvPageSent;
+ struct timezone tz;
+
+ if (gettimeofday (&tvPageSent, &tz))
+ // Error in gettimeofday
+ Dat_Time.TimeSendInMicroseconds = 0;
+ else
+ {
+ if (tvPageSent.tv_usec < Dat_Time.tvPageCreated.tv_usec)
+ {
+ tvPageSent.tv_sec--;
+ tvPageSent.tv_usec += 1000000;
+ }
+ Dat_Time.TimeSendInMicroseconds = (tvPageSent.tv_sec - Dat_Time.tvPageCreated.tv_sec) * 1000000L +
+ tvPageSent.tv_usec - Dat_Time.tvPageCreated.tv_usec;
+ }
+ }
+
+/*****************************************************************************/
+/************** Write the time to generate and send the page *****************/
+/*****************************************************************************/
+
+void Dat_WriteTimeToGenerateAndSendPage (void)
+ {
+ extern const char *Txt_PAGE1_Page_generated_in;
+ extern const char *Txt_PAGE2_and_sent_in;
+ char StrTimeGenerationInMicroseconds[Dat_MAX_BYTES_TIME + 1];
+ char StrTimeSendInMicroseconds[Dat_MAX_BYTES_TIME + 1];
+
+ Dat_WriteTime (StrTimeGenerationInMicroseconds,Dat_GetTimeGenerationInMicroseconds ());
+ Dat_WriteTime (StrTimeSendInMicroseconds ,Dat_GetTimeSendInMicroseconds ());
+ HTM_TxtF ("%s %s %s %s",
+ Txt_PAGE1_Page_generated_in,StrTimeGenerationInMicroseconds,
+ Txt_PAGE2_and_sent_in,StrTimeSendInMicroseconds);
+ }
+
+/*****************************************************************************/
+/********* Write time (given in microseconds) depending on amount ************/
+/*****************************************************************************/
+
+void Dat_WriteTime (char Str[Dat_MAX_BYTES_TIME],long TimeInMicroseconds)
+ {
+ if (TimeInMicroseconds < 1000L)
+ snprintf (Str,Dat_MAX_BYTES_TIME + 1,"%ld µs",TimeInMicroseconds);
+ else if (TimeInMicroseconds < 1000000L)
+ snprintf (Str,Dat_MAX_BYTES_TIME + 1,"%ld ms",TimeInMicroseconds / 1000);
+ else if (TimeInMicroseconds < (60 * 1000000L))
+ snprintf (Str,Dat_MAX_BYTES_TIME + 1,"%.1f s",
+ (double) TimeInMicroseconds / 1E6);
+ else
+ snprintf (Str,Dat_MAX_BYTES_TIME + 1,"%ld min, %ld s",
+ TimeInMicroseconds / (60 * 1000000L),
+ (TimeInMicroseconds / 1000000L) % 60);
+ }
+
/*****************************************************************************/
/******************************** Reset date *********************************/
/*****************************************************************************/
@@ -195,7 +341,7 @@ void Dat_PutScriptDateFormat (Dat_Format_t Format)
if (asprintf (&Id,"date_format_%u",(unsigned) Format) < 0)
Err_NotEnoughMemoryExit ();
- Dat_WriteLocalDateHMSFromUTC (Id,Gbl.StartExecutionTimeUTC,
+ Dat_WriteLocalDateHMSFromUTC (Id,Dat_GetStartExecutionTimeUTC (),
Format,Dat_SEPARATOR_NONE,
false,true,false,0x0);
free (Id);
@@ -245,15 +391,6 @@ Dat_Format_t Dat_GetDateFormatFromStr (const char *Str)
return Dat_FORMAT_DEFAULT;
}
-/*****************************************************************************/
-/************************** Get current time UTC *****************************/
-/*****************************************************************************/
-
-void Dat_GetStartExecutionTimeUTC (void)
- {
- Gbl.StartExecutionTimeUTC = time (NULL);
- }
-
/*****************************************************************************/
/********************** Get and convert current time *************************/
/*****************************************************************************/
@@ -261,30 +398,28 @@ void Dat_GetStartExecutionTimeUTC (void)
void Dat_GetAndConvertCurrentDateTime (void)
{
struct tm *tm_ptr;
+ time_t t = Dat_GetStartExecutionTimeUTC ();
/***** Convert current local time to a struct tblock *****/
- tm_ptr = Dat_GetLocalTimeFromClock (&Gbl.StartExecutionTimeUTC);
+ tm_ptr = Dat_GetLocalTimeFromClock (&t);
- Gbl.Now.Date.Year = tm_ptr->tm_year + 1900;
- Gbl.Now.Date.Month = tm_ptr->tm_mon + 1;
- Gbl.Now.Date.Day = tm_ptr->tm_mday;
- Gbl.Now.Time.Hour = tm_ptr->tm_hour;
- Gbl.Now.Time.Minute = tm_ptr->tm_min;
- Gbl.Now.Time.Second = tm_ptr->tm_sec;
+ Dat_Time.Now.Date.Year = tm_ptr->tm_year + 1900;
+ Dat_Time.Now.Date.Month = tm_ptr->tm_mon + 1;
+ Dat_Time.Now.Date.Day = tm_ptr->tm_mday;
+ Dat_Time.Now.Time.Hour = tm_ptr->tm_hour;
+ Dat_Time.Now.Time.Minute = tm_ptr->tm_min;
+ Dat_Time.Now.Time.Second = tm_ptr->tm_sec;
/***** Initialize current date in format YYYYMMDD *****/
- snprintf (Gbl.Now.Date.YYYYMMDD,sizeof (Gbl.Now.Date.YYYYMMDD),
+ snprintf (Dat_Time.Now.Date.YYYYMMDD,sizeof (Dat_Time.Now.Date.YYYYMMDD),
"%04u%02u%02u",
- Gbl.Now.Date.Year,Gbl.Now.Date.Month,Gbl.Now.Date.Day);
+ Dat_Time.Now.Date.Year,Dat_Time.Now.Date.Month,Dat_Time.Now.Date.Day);
/***** Initialize current time in format YYYYMMDDHHMMSS *****/
- snprintf (Gbl.Now.YYYYMMDDHHMMSS,sizeof (Gbl.Now.YYYYMMDDHHMMSS),
+ snprintf (Dat_Time.Now.YYYYMMDDHHMMSS,sizeof (Dat_Time.Now.YYYYMMDDHHMMSS),
"%04u%02u%02u%02u%02u%02u",
- Gbl.Now.Date.Year,Gbl.Now.Date.Month,Gbl.Now.Date.Day,
- Gbl.Now.Time.Hour,Gbl.Now.Time.Minute,Gbl.Now.Time.Second);
-
- /***** Compute what day was yesterday *****/
- Dat_GetDateBefore (&Gbl.Now.Date,&Gbl.Yesterday);
+ Dat_Time.Now.Date.Year,Dat_Time.Now.Date.Month ,Dat_Time.Now.Date.Day,
+ Dat_Time.Now.Time.Hour,Dat_Time.Now.Time.Minute,Dat_Time.Now.Time.Second);
}
/*****************************************************************************/
@@ -376,7 +511,7 @@ void Dat_ShowClientLocalTime (void)
HTM_SCRIPT_Begin (NULL,NULL);
HTM_TxtF ("secondsSince1970UTC = %ld;\n"
"writeLocalClock();\n",
- (long) Gbl.StartExecutionTimeUTC);
+ (long) Dat_GetStartExecutionTimeUTC ());
HTM_SCRIPT_End ();
}
@@ -449,6 +584,7 @@ void Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (const Dat_SetHMS
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Yesterday;
extern const char *Txt_Today;
+ unsigned CurrentYear = Dat_GetCurrentYear ();
/***** Start date-time *****/
HTM_TR_Begin (NULL);
@@ -462,7 +598,7 @@ void Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (const Dat_SetHMS
"Start",
Gbl.DateRange.TimeUTC[Dat_STR_TIME],
Cfg_LOG_START_YEAR,
- Gbl.Now.Date.Year,
+ CurrentYear,
Dat_FORM_SECONDS_ON,
SetHMS[Dat_STR_TIME],
false); // Don't submit on change
@@ -489,7 +625,7 @@ void Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (const Dat_SetHMS
"End",
Gbl.DateRange.TimeUTC[Dat_END_TIME],
Cfg_LOG_START_YEAR,
- Gbl.Now.Date.Year,
+ CurrentYear,
Dat_FORM_SECONDS_ON,
SetHMS[Dat_END_TIME],
false); // Don't submit on change
@@ -530,7 +666,7 @@ void Dat_PutFormStartEndClientLocalDateTimes (const time_t TimeUTC[Dat_NUM_START
Id[StartEndTime],
TimeUTC[StartEndTime],
Cfg_LOG_START_YEAR,
- Gbl.Now.Date.Year + 1,
+ Dat_GetCurrentYear () + 1,
FormSeconds,
SetHMS[StartEndTime], // Set hour, minute and second?
false); // Don't submit on change
@@ -1017,7 +1153,7 @@ void Dat_GetDateFromForm (const char *ParamNameDay,const char *ParamNameMonth,co
void Dat_SetIniEndDates (void)
{
Gbl.DateRange.TimeUTC[Dat_STR_TIME] = (time_t) 0;
- Gbl.DateRange.TimeUTC[Dat_END_TIME] = Gbl.StartExecutionTimeUTC;
+ Gbl.DateRange.TimeUTC[Dat_END_TIME] = Dat_GetStartExecutionTimeUTC ();
}
/*****************************************************************************/
@@ -1071,7 +1207,7 @@ void Dat_GetIniEndDatesFromForm (void)
/***** Get end date *****/
Gbl.DateRange.TimeUTC[Dat_END_TIME] = Dat_GetTimeUTCFromForm ("EndTimeUTC");
if (Gbl.DateRange.TimeUTC[Dat_END_TIME] == 0) // Gbl.DateRange.TimeUTC[Dat_END_TIME] == 0 ==> end date not specified
- Gbl.DateRange.TimeUTC[Dat_END_TIME] = Gbl.StartExecutionTimeUTC;
+ Gbl.DateRange.TimeUTC[Dat_END_TIME] = Dat_GetStartExecutionTimeUTC ();
/* Convert current time UTC to a local date */
tm_ptr = Dat_GetLocalTimeFromClock (&Gbl.DateRange.TimeUTC[Dat_END_TIME]);
diff --git a/swad_date.h b/swad_date.h
index 07baac00..1456aa5b 100644
--- a/swad_date.h
+++ b/swad_date.h
@@ -126,6 +126,20 @@ typedef enum
/***************************** Public prototypes *****************************/
/*****************************************************************************/
+void Dat_SetStartExecutionTimeval (void);
+void Dat_SetStartExecutionTimeUTC (void);
+time_t Dat_GetStartExecutionTimeUTC (void);
+struct Dat_Date *Dat_GetCurrentDate (void);
+unsigned Dat_GetCurrentDay (void);
+unsigned Dat_GetCurrentMonth (void);
+unsigned Dat_GetCurrentYear (void);
+long Dat_GetTimeGenerationInMicroseconds (void);
+long Dat_GetTimeSendInMicroseconds (void);
+void Dat_ComputeTimeToGeneratePage (void);
+void Dat_ComputeTimeToSendPage (void);
+void Dat_WriteTimeToGenerateAndSendPage (void);
+void Dat_WriteTime (char Str[Dat_MAX_BYTES_TIME],long TimeInMicroseconds);
+
void Dat_ResetDate (struct Dat_Date *Date);
void Dat_ResetHour (struct Dat_Hour *Hour);
@@ -137,7 +151,6 @@ void Dat_PutScriptDateFormat (Dat_Format_t Format);
void Dat_ChangeDateFormat (void);
Dat_Format_t Dat_GetDateFormatFromStr (const char *Str);
-void Dat_GetStartExecutionTimeUTC (void);
void Dat_GetAndConvertCurrentDateTime (void);
time_t Dat_GetUNIXTimeFromStr (const char *Str);
diff --git a/swad_error.c b/swad_error.c
index 03a52516..745cab12 100644
--- a/swad_error.c
+++ b/swad_error.c
@@ -575,12 +575,12 @@ void Err_ShowErrorAndExit (const char *Txt)
/***** Page is generated (except