Aktuelle Zeit: 15.11.2019 01:44

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: [Linux, Win?, Mac?] DateTime mit Locales
BeitragVerfasst: 29.06.2018 15:51 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Hi Leute,

das hier ist so ein Proof of Concept für die Darstellung eines Datums und der Zeit mittels locales. Es funktioniert bisher gut, aber es gibt auch einen Crash, der als Beispiel ganz unten auskommentiert ist und den ich nicht verstehe. Vielleicht hat da jemand eine Idee.

Ich möchte das ganze auch noch auf Zahlen und Geldbeträge ausweiten. Für Linux kein Problem, aber ich könnte Hilfe für die anderen Betriebssysteme gebrauchen. Und dann mache ich ein Module daraus. Wie gefällt euch die Parameterübergabe? Soll ich vielleicht das setlocale() sogar auslagern, sodass man es einmal setzt und dann kann man beliebig viele Date-Funktionen aufrufen?

Wichtig ist, dass es nur mit locales funktioniert, die auch installiert sind. Ihr findet das unter Linux heraus, indem ihr im Terminal "locale -a" eingibt. Neu hinzufügen für z.B. Russisch geht so:
Code:
sudo locale-gen ru_RU.UTF-8
sudo update-locale

Und wenn ihr nicht wisst, was ihr noch installieren könntet, gibt es hier eine Liste: /usr/share/i18n/SUPPORTE

Hier aber nun der Code.
Code:
Structure tm
   tm_sec.l   ; seconds
   tm_min.l   ; minutes
   tm_hour.l   ; hours
   tm_mday.l   ; day of the month
   tm_mon.l   ; month
   tm_year.l   ; number of years since 1900
   tm_wday.l   ; day of the week
   tm_yday.l   ; day in the year
   tm_isdst.l   ; daylight saving time
EndStructure

Enumeration 1
   #LC_ALL
   #LC_COLLATE
   #LC_CTYPE
   #LC_MONETARY
   #LC_NUMERIC
   #LC_TIME
EndEnumeration

Import ""
   time(*rawtime)
   localtime.i(*rawtime)
   strftime(*dest, maxsize.l, format.p-utf8, *timeprt.tm)
   setlocale(t.i, locale.p-ascii)
EndImport

Procedure.s localDateTime(date.q, mask.s = "%x %X", locale.s = "")
   Protected bufferSize.i = 12
   Protected *result = AllocateMemory(bufferSize), *tResult
   Protected tm.tm, *oldLocale, oldLocale.s, result.s
   tm\tm_sec = Second(date)
   tm\tm_min = Minute(date)
   tm\tm_hour = Hour(date)
   tm\tm_mday = Day(date)
   tm\tm_mon = Month(date) - 1
   tm\tm_year = Year(date) - 1900
   tm\tm_wday = DayOfWeek(date)
   tm\tm_yday = DayOfYear(date) - 1
   tm\tm_isdst = 0
   
   *oldLocale = setlocale(#LC_TIME, locale)
   If Not *oldLocale
      DebuggerWarning("Locale could not be set: " + locale)
   Else
      oldLocale = PeekS(*oldLocale, -1, #PB_Ascii)
   EndIf
   
   
   While Not strftime(*result, bufferSize, mask, @tm)
      bufferSize * 2
      *tResult = ReAllocateMemory(*result, bufferSize, #PB_Memory_NoClear)
      If Not *result
         DebuggerWarning("Could not allocate enough memory for datetime conversion.")
         Break
      EndIf
      *result = *tResult
   Wend
   
   result = PeekS(*result, -1, #PB_UTF8)
   
   FreeMemory(*result)
   
   If *oldLocale
      setlocale(#LC_TIME, oldLocale)
   EndIf
   
   ProcedureReturn result
EndProcedure

Debug localDateTime(Date(2018, 3, 3, 0, 0, 0), "Heute ist %A. Wir haben %X Uhr und es ist der %x. Der Monat ist %B.", "de_DE.UTF8")

; Das hier crasht :(
;Debug localDateTime(Date(), "%c", "de_DE.UTF8")

_________________
Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [Linux, Win?, Mac?] DateTime mit Locales
BeitragVerfasst: 29.06.2018 23:48 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
Code:
*tResult = ReAllocateMemory(*result, bufferSize, #PB_Memory_NoClear)
If Not *result
ändern zu:
Code:
*tResult = ReAllocateMemory(*result, bufferSize, #PB_Memory_NoClear)
If Not *tResult

Das Problem ist damit aber leider noch nicht gelöst.

_________________
Bild
Warum OpenSource eine Lizenz haben sollte
PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!
Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [Linux, Win?, Mac?] DateTime mit Locales
BeitragVerfasst: 30.06.2018 07:28 
Offline
Benutzeravatar

Registriert: 28.12.2004 17:35
Wohnort: Trostberg
bei mir crasht nichts.
Win 7 64bit, Purebasic 5.61 64bit


Debug localDateTime(Date(2018, 3, 3, 0, 0, 0), "Heute ist %A. Wir haben %X Uhr und es ist der %x. Der Monat ist %B.", "de_DE.UTF8")

; Das hier crasht :(
Debug localDateTime(Date(), "%c", "de_DE.UTF8")

Heute ist Saturday. Wir haben 00:00:00 Uhr und es ist der 03/03/18. Der Monat ist March.
06/30/18 07:26:34


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [Linux, Win?, Mac?] DateTime mit Locales
BeitragVerfasst: 30.06.2018 10:22 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Moment, das läuft auf Windows 7? :shock: Ist das etwa kompatibel? Es kommt trotzdem das falsche Ergebnis bei dir raus. Mit de_DE sollte natürlich alles deutsch sein.

_________________
Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [Linux, Win?, Mac?] DateTime mit Locales
BeitragVerfasst: 30.06.2018 10:56 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Im Header Datei von locale.h stehen bei mir andere Konstanten.
Zitat:
#LC_ALL = 0
#LC_COLLATE = 1
#LC_CTYPE = 2
#LC_MONETARY = 3
#LC_NUMERIC = 4
#LC_TIME = 5
#LC_MESSAGES = 6


Bei MacOS funktioniert es nicht mit der C++ Lib. Das setzen von locale auf andere Sprachen schlägt fehl.
Es wird nur "C" und "POSIX" akzeptiert.

P.S
Windows schlägt auch fehl...

UND

Linux schlägt fehl... Unter Linux steht locale schon auf Userdefault.

Test
Code:
#LC_ALL       = 0
#LC_COLLATE   = 1
#LC_CTYPE     = 2
#LC_MONETARY  = 3
#LC_NUMERIC   = 4
#LC_TIME      = 5
#LC_MESSAGES  = 6

; Enumeration 1
;    #LC_ALL
;    #LC_COLLATE
;    #LC_CTYPE
;    #LC_MONETARY
;    #LC_NUMERIC
;    #LC_TIME
; EndEnumeration

Import ""
   setlocale(t.i, *locale)
EndImport

*oldlocale = setlocale(#LC_TIME, 0)
Debug "Default: " + PeekS(*oldlocale, -1, #PB_Ascii)

*locale = Ascii("")
Debug setlocale(#LC_TIME, *locale)
FreeMemory(*locale)

*locale = Ascii("de-DE.UTF8")
Debug setlocale(#LC_ALL, *locale)
FreeMemory(*locale)

*locale = Ascii("de-DE")
Debug setlocale(#LC_TIME, *locale)
FreeMemory(*locale)

*locale = Ascii("en-EN.UTF-8")
Debug setlocale(#LC_TIME, *locale)
FreeMemory(*locale)

*locale = Ascii("POSIX")
Debug setlocale(#LC_TIME, *locale)
FreeMemory(*locale)

*locale = Ascii("C")
Debug setlocale(#LC_TIME, *locale)
FreeMemory(*locale)

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [Linux, Win?, Mac?] DateTime mit Locales
BeitragVerfasst: 30.06.2018 11:56 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Wie es aus sieht kann man nur zwischen Userdefault und "C" mit setlocale wechseln.
Nur bei MacOS geht es nicht.

Update 'C'
Code:
Structure tm
  tm_sec.l   ; seconds
  tm_min.l   ; minutes
  tm_hour.l  ; hours
  tm_mday.l  ; day of the month
  tm_mon.l   ; month
  tm_year.l  ; number of years since 1900
  tm_wday.l  ; day of the week
  tm_yday.l  ; day in the year
  tm_isdst.l ; daylight saving time
EndStructure

#LC_ALL       = 0
#LC_COLLATE   = 1
#LC_CTYPE     = 2
#LC_MONETARY  = 3
#LC_NUMERIC   = 4
#LC_TIME      = 5
#LC_MESSAGES  = 6

ImportC ""
  time(*rawtime)
  localtime.i(*rawtime)
  strftime(*dest, maxsize.l, format.p-utf8, *timeprt.tm)
  setlocale(t.i, *locale)
EndImport

Procedure.s localDateTime(date.q, mask.s = "%x %X", locale.s="")
  Protected bufferSize.i = 12, *locale
  Protected *result = AllocateMemory(bufferSize), *tResult
  Protected tm.tm, *oldLocale, oldLocale.s, result.s
  tm\tm_sec = Second(date)
  tm\tm_min = Minute(date)
  tm\tm_hour = Hour(date)
  tm\tm_mday = Day(date)
  tm\tm_mon = Month(date) - 1
  tm\tm_year = Year(date) - 1900
  tm\tm_wday = DayOfWeek(date)
  tm\tm_yday = DayOfYear(date) - 1
  tm\tm_isdst = 0
 
  *locale = Ascii(locale)
 
  *oldLocale = setlocale(#LC_TIME, 0)
  If Not setlocale(#LC_TIME, *locale)
    DebuggerWarning("Locale could not be set: " + locale)
    Debug "No set"
  EndIf
 
 
  While Not strftime(*result, bufferSize, mask, @tm)
    bufferSize * 2
    *tResult = ReAllocateMemory(*result, bufferSize, #PB_Memory_NoClear)
    If Not *result
      DebuggerWarning("Could not allocate enough memory for datetime conversion.")
      Break
    EndIf
    *result = *tResult
  Wend
 
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    result = PeekS(*result, -1, #PB_Ascii)
  CompilerElse
    result = PeekS(*result, -1, #PB_UTF8)
  CompilerEndIf
 
  FreeMemory(*result)
 
  If *oldLocale
    setlocale(#LC_TIME, *oldLocale)
  EndIf
 
  FreeMemory(*locale)
 
  ProcedureReturn result
EndProcedure

Debug localDateTime(Date(2018, 3, 28, 12, 0, 0), "Heute ist %A. Wir haben %X Uhr und es ist der %x. Der Monat ist %B.")
Debug localDateTime(Date(2018, 3, 28, 12, 0, 0), "Heute ist %A. Wir haben %X Uhr und es ist der %x. Der Monat ist %B.", "C")

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Zuletzt geändert von mk-soft am 30.06.2018 21:46, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [Linux, Win?, Mac?] DateTime mit Locales
BeitragVerfasst: 30.06.2018 15:00 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
geht :D , Ubuntu 16.04
Code:
Heute ist Samstag. Wir haben 00:00:00 Uhr und es ist der 03.03.2018. Der Monat ist März.
Sa 30 Jun 2018 15:00:20 d

_________________
my pb stuff..
Bild..jedenfalls war das mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [Linux, Win?, Mac?] DateTime mit Locales
BeitragVerfasst: 30.06.2018 15:30 
Offline
Benutzeravatar

Registriert: 30.03.2010 15:24
ImportC "" ... sonst crashed es mit 32bit Compiler.

_________________
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [Linux, Win?, Mac?] DateTime mit Locales
BeitragVerfasst: 30.06.2018 17:41 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
NicTheQuick hat geschrieben:
Moment, das läuft auf Windows 7? :shock: Ist das etwa kompatibel?
Du importierst ja die Befehle von C++ ... :-)

#NULL hat geschrieben:
geht :D , Ubuntu 16.04
Code:
Heute ist Samstag. Wir haben 00:00:00 Uhr und es ist der 03.03.2018. Der Monat ist März.
Sa 30 Jun 2018 15:00:20 d
So sieht das bei mir auch aus, wenn ich die Debugs zu einem MessageRequester abändere und den Debugger abschalte.
Das "d" am Ende deutet aber darauf hin, dass die Ausgabe abgeschnitten und somit unvollständig ist.

_________________
Bild
Warum OpenSource eine Lizenz haben sollte
PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!
Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [Linux, Win?, Mac?] DateTime mit Locales
BeitragVerfasst: 30.06.2018 23:38 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Muss ich mir noch mal angucken. Komme wohl erst wieder am Montag dazu.

_________________
Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye