@@ -537,7 +537,7 @@ pspdf_export(tree_t *document, /* I - Document to export */
537537 if (!source_date_epoch || (doc_time = (time_t )strtol (source_date_epoch, NULL , 10 )) <= 0 )
538538 doc_time = time (NULL );
539539
540- gmtime_r (&doc_time, &doc_date);
540+ localtime_r (&doc_time, &doc_date);
541541
542542 num_headings = 0 ;
543543 alloc_headings = 0 ;
@@ -1706,14 +1706,96 @@ pspdf_prepare_heading(int page, // I - Page number
17061706 }
17071707 else if (formatlen == 4 && strncasecmp (formatptr, " TIME" , 4 ) == 0 )
17081708 {
1709+ char timefmt[256 ];// Time format
1710+
17091711 formatptr += 4 ;
1710- strftime (bufptr, sizeof (buffer) - 1 - (size_t )(bufptr - buffer), " %X" , &doc_date);
1712+ if (*formatptr == ' (' )
1713+ {
1714+ // Support "$TIME(format)"
1715+ char *timeptr;// Pointer into time format
1716+
1717+ for (timeptr = timefmt, formatptr ++; *formatptr && *formatptr != ' )' ; formatptr ++)
1718+ {
1719+ if (isalpha (*formatptr))
1720+ {
1721+ if (timeptr < (timefmt + sizeof (timefmt) - 2 ))
1722+ {
1723+ *timeptr++ = ' %' ;
1724+ *timeptr++ = *formatptr;
1725+ }
1726+ else
1727+ break ;
1728+ }
1729+ else if (timeptr < (timefmt + sizeof (timefmt) - 1 ))
1730+ {
1731+ *timeptr++ = *formatptr;
1732+ }
1733+ else
1734+ break ;
1735+ }
1736+
1737+ *timeptr = ' \0 ' ;
1738+
1739+ while (*formatptr && *formatptr != ' )' )
1740+ formatptr ++;
1741+
1742+ if (*formatptr)
1743+ formatptr ++;
1744+ }
1745+ else
1746+ {
1747+ // Use the locale default format...
1748+ strlcpy (timefmt, " %X" , sizeof (timefmt));
1749+ }
1750+
1751+ strftime (bufptr, sizeof (buffer) - 1 - (size_t )(bufptr - buffer), timefmt, &doc_date);
17111752 bufptr += strlen (bufptr);
17121753 }
17131754 else if (formatlen == 4 && strncasecmp (formatptr, " DATE" , 4 ) == 0 )
17141755 {
1756+ char datefmt[256 ];// Date format
1757+
17151758 formatptr += 4 ;
1716- strftime (bufptr, sizeof (buffer) - 1 - (size_t )(bufptr - buffer), " %x" , &doc_date);
1759+ if (*formatptr == ' (' )
1760+ {
1761+ // Support "$DATE(format)"
1762+ char *dateptr;// Pointer into date format
1763+
1764+ for (dateptr = datefmt, formatptr ++; *formatptr && *formatptr != ' )' ; formatptr ++)
1765+ {
1766+ if (isalpha (*formatptr))
1767+ {
1768+ if (dateptr < (datefmt + sizeof (datefmt) - 2 ))
1769+ {
1770+ *dateptr++ = ' %' ;
1771+ *dateptr++ = *formatptr;
1772+ }
1773+ else
1774+ break ;
1775+ }
1776+ else if (dateptr < (datefmt + sizeof (datefmt) - 1 ))
1777+ {
1778+ *dateptr++ = *formatptr;
1779+ }
1780+ else
1781+ break ;
1782+ }
1783+
1784+ *dateptr = ' \0 ' ;
1785+
1786+ while (*formatptr && *formatptr != ' )' )
1787+ formatptr ++;
1788+
1789+ if (*formatptr)
1790+ formatptr ++;
1791+ }
1792+ else
1793+ {
1794+ // Use the locale default format...
1795+ strlcpy (datefmt, " %x" , sizeof (datefmt));
1796+ }
1797+
1798+ strftime (bufptr, sizeof (buffer) - 1 - (size_t )(bufptr - buffer), datefmt, &doc_date);
17171799 bufptr += strlen (bufptr);
17181800 }
17191801 else if (formatlen == 3 && strncasecmp (formatptr, " URL" , 3 ) == 0 )
@@ -11565,9 +11647,9 @@ write_prolog(FILE *out, /* I - Output file */
1156511647 fprintf (out, " %%%%BoundingBox: 0 0 %d %d\n " , PageWidth, PageLength);
1156611648 fprintf (out," %%%%LanguageLevel: %d\n " , PSLevel);
1156711649 fputs (" %%Creator: " HTMLDOC_PRODUCER " \n " , out);
11568- fprintf (out, " %%%%CreationDate: D:%04d%02d%02d%02d%02d%02d+0000 \n " ,
11650+ fprintf (out, " %%%%CreationDate: D:%04d%02d%02d%02d%02d%02d%03d00 \n " ,
1156911651 doc_date.tm_year + 1900 , doc_date.tm_mon + 1 , doc_date.tm_mday ,
11570- doc_date.tm_hour , doc_date.tm_min , doc_date.tm_sec );
11652+ doc_date.tm_hour , doc_date.tm_min , doc_date.tm_sec , ( int )(doc_date. tm_gmtoff / 3600 ) );
1157111653 if (doc_title != NULL )
1157211654 fprintf (out, " %%%%Title: %s\n " , doc_title);
1157311655 if (author != NULL )
@@ -11949,9 +12031,9 @@ write_prolog(FILE *out, /* I - Output file */
1194912031 fputs (" /Producer" , out);
1195012032 write_string (out, (uchar *)HTMLDOC_PRODUCER, 0 );
1195112033 fputs (" /CreationDate" , out);
11952- snprintf (temp, sizeof (temp), " D:%04d%02d%02d%02d%02d%02dZ " ,
12034+ snprintf (temp, sizeof (temp), " D:%04d%02d%02d%02d%02d%02d%03d00 " ,
1195312035 doc_date.tm_year + 1900 , doc_date.tm_mon + 1 , doc_date.tm_mday ,
11954- doc_date.tm_hour , doc_date.tm_min , doc_date.tm_sec );
12036+ doc_date.tm_hour , doc_date.tm_min , doc_date.tm_sec , ( int )(doc_date. tm_gmtoff / 3600 ) );
1195512037 write_string (out, (uchar *)temp, 0 );
1195612038
1195712039 if (doc_title != NULL )
0 commit comments