2012-04-08 3 views
1

ich auf einem Embedded-Projekt arbeitete und brauche ein DDMMYY Datum und HHMMSSmmm Zeit zu einem .NET-Stil 100ns ticks since Jan 1, 0001.Wie Tag/Monat/Jahr Datum in .NET Stil 100ns Ticks seit dem 1. Januar 0001 konvertieren?

Ich habe die Werte in Jahr, Monat, Tag, Stunde ausgebrochen zu konvertieren, Sekunde, Minute, Millisekunden, etwa so:

//DDMMYY 
year = Date.Val % 100 + 2000;//Year 
month = (Date.Val/100) % 100;//JAN = 1, FEB = 2, etc 
day = (Date.Val/10000) % 100;//day of the month 
//HHMMSSmmm 
millisecond = (UTCTime.Val % 1000); 
second =  (UTCTime.Val/1000) % 100; 
minute =  (UTCTime.Val/100000) % 100; 
hour =   (UTCTime.Val/10000000) % 100; 

Was ich brauche ist jetzt eine Möglichkeit, diese Werte zu übernehmen und die eingebettete C Äquivalent hierzu folgendermaßen vor:

DateTime date = new DateTime(2012, 4, 7, 7, 5, 23, 205); 
long ticks1 = date.Ticks; 

bearbeiten 012.380. Ich arbeite an einem PIC32-Mikrocontroller.

+0

Es gibt eine Win32-Funktion namens [ 'SystemTimeToFileTime'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724948 (v = vs. 85) .aspx), die dies für Sie tun (außer eine Konstante hinzufügen). Hast du das zur Verfügung? –

+0

Ich arbeite an einem PIC32MX, also nein. Ich sollte diese Info hinzufügen. – CodeFusionMobile

Antwort

2

Ich denke, Sie können es mit nur Standard C tun, indem Sie mktime verwenden. Zuerst legen Sie Ihre Werte in eine struct tm:

struct tm { 
    int tm_sec;   /* seconds */ 
    int tm_min;   /* minutes */ 
    int tm_hour;  /* hours */ 
    int tm_mday;  /* day of the month */ 
    int tm_mon;   /* month */ 
    int tm_year;  /* year */ 
    int tm_wday;  /* day of the week */ 
    int tm_yday;  /* day in the year */ 
    int tm_isdst;  /* daylight saving time */ 
}; 

Sie können wday und yday ignorieren, sollte aber ISDST auf -1 (lesen Sie in der Manpage für Details) eingestellt. Dann rufen Sie mktime(), die Ihnen die Sekunden seit 1970 geben wird. Dann, mit welchen Mitteln auch immer, wie ein triviales einmaliges C# -Programm, finden Sie die Sekunden zwischen der Microsoft-Epoche und dem Unix. Dies ist ein unveränderlicher Wert, den Sie in Ihrem C-Programm fest codieren sollten. Fügen Sie das zu dem Ergebnis von mktime hinzu, multiplizieren Sie, um Sekunden in Ticks zu konvertieren, und fügen Sie Ihren Millisekunden-Teil hinzu.

+1

'mktime' ist problematisch, weil es in lokaler Zeit und nicht in universeller Zeit funktioniert. –

+0

Ich arbeite an einem PIC, wird das den Unterschied überhaupt bemerken? Will das morgen testen, um zu überprüfen, aber ich würde vermuten, dass es keine Möglichkeit geben würde zu wissen, in welcher Zeitzone es war. – CodeFusionMobile

3

Verwenden Sie die POSIX-Formel für Sekunden seit der richtigen Epoche, dann passen Sie es für die Anzahl der Sekunden zwischen der richtigen Epoche und der ".NET Epoch", skalieren und fügen Sie auf die 100-ns-Tick Komponente.

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + 
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - 
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400 

Quelle: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15

+0

Ich habe keinen Tag des Jahres, ich habe Tag des Monats. Macht diese Lösung ein wenig unpraktisch, aber immer noch funktional. – CodeFusionMobile

+0

Konvertiert nicht den Tag des Monats in den Tag des Jahres eine typische einleitende Programmierübung? Oder ist das in den 90er Jahren aus der Mode gekommen? :-) –

Verwandte Themen