Avatar billede stringbuffer Nybegynder
16. august 2003 - 21:35 Der er 17 kommentarer og
1 løsning

Datoformatering i windows

Jeg vil gerne formatere en SYSTEMTIME eller FILETIME til noget i stil med "August 16 2003 10:15 PM". I UNIX er det jo nemt nok hvis man kan bruge strftime(), men den kan ikke æde windows time structs.

Vis mig kode, der kan gøre det for mig.
Avatar billede soreno Praktikant
16. august 2003 - 21:41 #1
En SYSTEMTIME ser sådan ud:

typedef struct _SYSTEMTIME {  // st
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} SYSTEMTIME;

Så er det jo bare at gå igang med nogle switch/cases for at få det formaterert som du ønsker.
Avatar billede arne_v Ekspert
16. august 2003 - 21:42 #2
InternetTimeFromSystemTime

måske ?
Avatar billede arne_v Ekspert
16. august 2003 - 21:49 #4
#include <windows.h>
#include <wininet.h>

int main()
{
  SYSTEMTIME t;
  char buf[INTERNET_RFC1123_BUFSIZE];
  GetLocalTime(&t);
  InternetTimeFromSystemTime(&t,INTERNET_RFC1123_FORMAT,buf,sizeof(buf));
  printf("%s\n",buf);
  return 0;
}

giver:

C:\>wintim
Sat, 16 Aug 2003 21:48:57 GMT
Avatar billede arne_v Ekspert
16. august 2003 - 21:49 #5
Hvis du selv vil formatere så tror jeg at du må følge sørens råd.
Avatar billede soreno Praktikant
16. august 2003 - 21:56 #6
Det kan muligvis lade sig gøre at benytte strftime() i Windows.

Min compiler (mingw) har ihvertfald funktionen i time.h filen, samt <sys/types.h> findes også.
Avatar billede arne_v Ekspert
16. august 2003 - 21:59 #7
Selvfølgelig kan man bruge strftime i win32.

MS VC++ har den også.

Forskellen er ren SYSTEMTIME versus time_t.
Avatar billede arne_v Ekspert
16. august 2003 - 22:00 #8
time_t / tm
Avatar billede stringbuffer Nybegynder
16. august 2003 - 22:00 #9
Wow, I er sandeligt hurtige her... her tror jeg at jeg kan komme og svare på mit eget spørgsmål som den første og eneste, men næææh nej :) Det er jo skønt med så aktive hjælpere!

Men anyway, jeg fandt noget her: http://www.willows.com/cgi-bin/cvsweb/Willows/twin/osdll/DrvTime.c?rev=1.2

/* systemtime_to_tm: change a Windows SYSTEMTIME into an ANSI struct tm */
static void systemtime_to_tm(LPSYSTEMTIME lpst, struct tm *ptm)
{
  ptm->tm_year = lpst->wYear - 1900;
  ptm->tm_mon = lpst->wMonth - 1;
  ptm->tm_wday = lpst->wDayOfWeek;
  ptm->tm_mday = lpst->wDay;
  ptm->tm_hour = lpst->wHour;
  ptm->tm_min = lpst->wMinute;
  ptm->tm_sec = lpst->wSecond;
  ptm->tm_isdst = -1;
}

Og det kombinerer jeg lige med sådan noget:
date_len = strftime(sz_date, sizeof(sz_date) - 1, "%B %d %Y %I:%M %p", &my_tm );

Jeg takker for interessen :)
Avatar billede soreno Praktikant
16. august 2003 - 22:01 #10
Nåå ja !

Det lader til at det oprindelige spørgsmål var blevet garbage collected i brain v.1.0 - måske man skulle patche til brain v1.1

:-)
Avatar billede stringbuffer Nybegynder
16. august 2003 - 22:02 #11
Forresten, grunden til hvorfor jeg var tvunget til at arbejde med SYSTEMTIME var at jeg fik leveret en FILETIME.
Avatar billede stringbuffer Nybegynder
16. august 2003 - 22:04 #12
LOL @ soreno
Avatar billede arne_v Ekspert
16. august 2003 - 22:23 #13
Hvis du bruger MFC så er det meget nemt !

#include <afxwin.h>

int main()
{
  printf("%s\n",(LPCTSTR)CTime::GetCurrentTime().Format("%a, %d %b %Y %H:%M:%S GMT"));
  return 0;
}

giver:

C:\>wintim2
Sat, 16 Aug 2003 22:22:59 GMT
Avatar billede arne_v Ekspert
16. august 2003 - 22:27 #14
OK du havde SYSTEMTIEM så:

#include <afxwin.h>

int main()
{
  SYSTEMTIME t;
  GetLocalTime(&t);
  printf("%s\n",(LPCTSTR)(new CTime(t))->Format("%a, %d %b %Y %H:%M:%S GMT"));
  return 0;
}
Avatar billede arne_v Ekspert
16. august 2003 - 22:28 #15
strftime the MFC way !

[og ja jeg har bemærket at du har lukket spørgsmålet, men andre kunne måske bruge
svaret til noget]
Avatar billede stringbuffer Nybegynder
16. august 2003 - 22:42 #16
Ikke for noget, men smider du ikke et nyt objekt i hukommelsen, som ikke vil blive nedlagt før prog'et afsluttes?
Avatar billede arne_v Ekspert
16. august 2003 - 22:46 #17
Jo.

Så man bør gemme en referance og delete den igen.
Avatar billede stringbuffer Nybegynder
16. august 2003 - 22:50 #18
Jeg koder forresten ren C... men tak, den skal jeg nok kunne bruge på et tidspunkt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester