UnixTimeDate

SwordfishUser.UnixTimeDate History

Hide minor edits - Show changes to output

Changed line 33 from:
   USART.Write(DecToStr(SntpTime.Year),32DecToStr(SntpTime.Hour),":",DecToStr(SntpTime.Min))
to:
   USART.Write(DecToStr(SntpTime.Year),32,DecToStr(SntpTime.Hour),":",DecToStr(SntpTime.Min))
Changed lines 33-34 from:
   USART.Write(DecToStr(SntpTime.Year),32DecToStr(SntpTime.Hour),":",DecToStr(SntpTime.Min),":",DecToStr(SntpTime.Sec))
to:
   USART.Write(DecToStr(SntpTime.Year),32DecToStr(SntpTime.Hour),":",DecToStr(SntpTime.Min))
    USART.Write(
":",DecToStr(SntpTime.Sec))
Changed lines 32-33 from:
   USART.Write(SntpTime.DowStr,DecToStr(SntpTime.Day),32,DecToStr(SntpTime.Month),32,DecToStr(SntpTime.Year),32)
    USART.Write(DecToStr(SntpTime.Hour),":",DecToStr(SntpTime.Min),":",DecToStr(SntpTime.Sec))
to:
   USART.Write(SntpTime.DowStr,DecToStr(SntpTime.Day),32,DecToStr(SntpTime.Month),32)
    USART.Write(DecToStr(SntpTime.Year),32DecToStr(SntpTime.Hour),":",DecToStr(SntpTime.Min),":",DecToStr(SntpTime.Sec))
Changed lines 1-3 from:

A small function tocConvert a Unix timestamp to Readable Date/time.
to:
A small module to convert a Unix timestamp to Readable Date/time.
Added lines 1-138:

A small function tocConvert a Unix timestamp to Readable Date/time.

Defines a structure to hold the date after the conversion and names it SntpTime.
A conversion from a Proton version by Gabi

The variables in the structute are:-

    Sec As Byte
    Min As Byte
    Hour As Byte
    Year As Word
    Month As Byte
    Day As Byte
    Dow As Byte
    DowStr As String * 3

Demo code
=code [=
    Include "usart.bas"
    Include "convert.bas"
    Include "unixtimedate.bas"
   
   
    Dim unixtime As LongWord
   
    SetBaudrate(br19200)
                                                                                                     
    unixtime = 34857915
                                                                                                 
    UnixToDate(unixtime)
       
    USART.Write(SntpTime.DowStr,DecToStr(SntpTime.Day),32,DecToStr(SntpTime.Month),32,DecToStr(SntpTime.Year),32)
    USART.Write(DecToStr(SntpTime.Hour),":",DecToStr(SntpTime.Min),":",DecToStr(SntpTime.Sec))
=]

The module

=code [=
{
****************************************************************
*  Name    : UnixTimeDate.BAS                                  *
*  Author  : Gabi Mihaila / Tim Box                            *
*  Notice  : No Copyright                                      *
*          :                                                  *
*  Date    : 17-Oct-06                                        *
*  Version : 1.0                                              *
*  Notes  :                                                  *
*          :                                                  *
****************************************************************
}

Module UnixTimeDate

    Structure  UnixSntpTime
    Sec As Byte
    Min As Byte
    Hour As Byte
    Year As Word
    Month As Byte
    Day As Byte
    Dow As Byte
    DowStr As String * 3
    End Structure
   
 Dim   
    TempDay As LongWord,
    tempa As LongWord
   
 Public Dim SntpTime As UnixSntpTime
   
Const   
    Months_Days(13) As Byte = ( 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
    DOWStrConst(7) As String = ("Thu","Fri","Sat","Sun","Mon","Tue","Wed")

Public Sub  UnixToDate(PUnixTime As LongWord)
{
    check with    http://www.onlineconversion.com/PUnixTime.htm
    Example --> PUnixTime = 1160906700 ; input Unix Time Stamp and call this sub
}
// seconds:
SntpTime.Sec = PUnixTime Mod 60 //;
PUnixTime = PUnixTime / 60  //;
// minutes:
SntpTime.Min = PUnixTime Mod 60
PUnixTime = PUnixTime / 60
// hours:
SntpTime.Hour = PUnixTime Mod 24
PUnixTime = PUnixTime / 24
    // here PUnixTime equals number of days since Thu 1st Jan 1970
    // so we can find the day of the week like this:
    SntpTime.Dow = PUnixTime Mod 7    ' DOW      0,  1,  2,  3,  4,  5,  6
                              ' DOW_STR  Thu Fri Sat Sun Mon Tue Wed 

    SntpTime.DowStr = DOWStrConst(SntpTime.Dow)
   
    //
SntpTime.Year = 1970        //  we start with the NTP starting year offset
// year:
While 1 = 1
    TempDay = 365              //  say its a normal year (not leap)
If (SntpTime.Year And $03) = 0 Then
TempDay = 365 + 1      // LEAP Year
        EndIf   
        If  TempDay > PUnixTime Then
            Break
        EndIf
PUnixTime = PUnixTime - TempDay
Inc (SntpTime.Year)
    Wend
// month:
    For SntpTime.Month = 1 To 12                           
tempa = Months_Days(SntpTime.Month)
        If PUnixTime <= tempa Then
          Break
        EndIf
        PUnixTime = PUnixTime - tempa 
Next
// days:
If TempDay = 366 And SntpTime.Month <= 2 Then
        SntpTime.Day = PUnixTime + 1
        Exit
    ElseIf TempDay = 366 And SntpTime.Month > 2 Then
        SntpTime.Day = PUnixTime
        Exit
    EndIf
    If TempDay = 365 And SntpTime.Month = 2 Then
        SntpTime.Day = PUnixTime + 1
        If SntpTime.Day = 29 Then
          SntpTime.Day = 1
          SntpTime.Month = SntpTime.Month + 1
        EndIf
        Exit
    EndIf
    SntpTime.Day = PUnixTime + 1
End Sub
End
=]