Let's fix this right: strptime() isn't POSIX, nor is it especially
common. Worse: some platforms support strptime incorrectly (as per XPG5-
notably some versions of OpenVMS)
Even worse: It isn't needed. Better to rewrite with sscanf().
Consider:
struct tm tm;
if (sscanf(sqldate, "%d-%d-%d %d:%d:%d",
&tm.tm_year, &tm.tm_mon, &tm.tm_mday,
&tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) { /*err...*/
And fixing up:
if (tm.tm_year < 60) tm.tm_year += 2000;
else if (tm.tm_year < 1000) tm.tm_year += 1900;
tm.tm_mon--;
And finally:
char *mon[12] = { "Jan","Feb","Mar",... };
sprintf(out, "%02d-%s-%04d +0000", tm.tm_mday, mon[tm.tm_mon],
tm.tm_year);
I'd really recommend mandating that the [SQL] server store UTC. Using
time zones other than +0000 definitely cause problems with many C
libraries and email clients-- even when they can do conversion into
local.
Outlook Express is a big loser here...
On Wed, 2005-05-11 at 13:20 -0700, Chris Reichow wrote:
> This is really in reply to Aaron's last email regarding 2.0.5, but I
> just joined the list 5 seconds ago, so I don't have a copy. =(
>
> Bug 193:
> http://www.dbmail.org/mantis/bug_view_advanced_page.php?bug_id=0000193
>
> dbmail will not compile on FreeBSD without editing imaputil.c and
> reverting back to a tm_gmtoff type solution. I manually edited this to
> compile yesterday, but I am not well-versed in cross platform
> development and I have no idea if it would compile in Linux, etc.
>
> Here is my interim solution if anyone is interested. Not the prettiest,
> but it gets the job done.
>
> char *date_sql2imap(const char *sqldate)
> {
> time_t temp = time(0);
> struct tm *tms = localtime(&temp);
>
> long gmt_offset=0;
> struct tm tm_sql_date;
> char *last;
>
> /* defined by tzset */
> //extern long timezone;
> //timezone=0;
> //tzset();
>
> last = strptime(sqldate,"%Y-%m-%d %T", &tm_sql_date);
> if ( (last == NULL) || (*last != '\0') ) {
> trace(TRACE_DEBUG, "%s,%s, error parsing date [%s]",
> __FILE__, __func__, sqldate);
> strcpy(_imapdate, IMAP_STANDARD_DATE);
> return _imapdate;
> }
>
> gmt_offset = (-tms->tm_gmtoff)/3600;
> if (tm_sql_date.tm_isdst)
> gmt_offset++;
>
> snprintf(_imapdate,IMAP_INTERNALDATE_LEN,"%s %c%02ld00",
> sqldate,
> (gmt_offset >= 0 ? '+': '-'),
> gmt_offset);
> return _imapdate;
> }
>
>
> _______________________________________________
> Dbmail-dev mailing list
> [email protected]
> http://twister.fastxs.net/mailman/listinfo/dbmail-dev
--
Internet Connection High Quality Web Hosting
http://www.internetconnection.net/