Page 1 sur 2

Date divers

Publié : lun. 03/oct./2005 20:51
par Droopy
2 fonctions sur les dates

Code : Tout sélectionner


Procedure.s FrenchDate(date) ;/ Renvoie la Date au format texte : Ex : Vendredi 3 Février 2005
  
  Select DayOfWeek(date)
    Case 0 
      Temp.s+"Dimanche"
    Case 1 
      Temp.s+"Lundi"
    Case 2 
      Temp.s+"Mardi"
    Case 3 
      Temp.s+"Mercredi"
    Case 4 
      Temp.s+"Jeudi"
    Case 5 
      Temp.s+"Vendredi"
    Case 6 
      Temp.s+"Samedi"
  EndSelect
  
  
  Temp2.s=FormatDate("%dd", date) 
  If Left(Temp2,1)="0" : Temp2=Right(Temp2,1) : EndIf
  Temp+" "+Temp2+" "
  
  
  
  Select Month(date)
    Case 1
      Temp+"Janvier"
    Case 2
      Temp+"Février"
    Case 3
      Temp+"Mars"
    Case 4
      Temp+"Avril"
    Case 5
      Temp+"Mai"
    Case 6
      Temp+"Juin"
    Case 7
      Temp+"Juillet"
    Case 8
      Temp+"Aout"
    Case 9
      Temp+"Septembre"
    Case 10
      Temp+"Octobre"
    Case 11
      Temp+"Novembre"
    Case 12
      Temp+"Décembre"
  EndSelect
  
  Temp+FormatDate(" %yyyy",date) 
  
  ProcedureReturn Temp
EndProcedure

Procedure Week(date);/ Renvoie le n° de la semaine de la date donnée en paramètre
  
  Compteur=Date(Year(date),1,1,0,0,1) ;/ Jour de l'an
  
  ;/ On se positionne au 1° dimanche après le jour de l'an
  Repeat
    If DayOfWeek(Compteur)=0 : Break : EndIf
    Compteur=AddDate(Compteur,#PB_Date_Day,1)
  ForEver

  ;/ On incrément d'une semaine / à chaque fois on teste si dépassement de la date donnée
  Repeat
    Semaine+1
    ; Debug FrenchDate(Compteur)
    If Compteur>date : Break : EndIf
    Compteur=AddDate(Compteur,#PB_Date_Week,1)
   ForEver
  
  ProcedureReturn Semaine
EndProcedure
  
;/ Test  
MessageRequester("Test Date","Semaine n° "+Str(Week(Date()))+#CRLF$+FrenchDate(Date()),#MB_ICONINFORMATION)

Publié : mar. 04/oct./2005 19:00
par Droopy
Bug corrigé

Code : Tout sélectionner

Procedure.s FrenchDate(date) ;/ Renvoie la Date au format texte : Ex : Vendredi 3 Février 2005
  
  Select DayOfWeek(date)
    Case 0 
      Temp.s+"Dimanche"
    Case 1 
      Temp.s+"Lundi"
    Case 2 
      Temp.s+"Mardi"
    Case 3 
      Temp.s+"Mercredi"
    Case 4 
      Temp.s+"Jeudi"
    Case 5 
      Temp.s+"Vendredi"
    Case 6 
      Temp.s+"Samedi"
  EndSelect
  
  
  Temp2.s=FormatDate("%dd", date) 
  If Left(Temp2,1)="0" : Temp2=Right(Temp2,1) : EndIf
  Temp+" "+Temp2+" "
  
  
  
  Select Month(date)
    Case 1
      Temp+"Janvier"
    Case 2
      Temp+"Février"
    Case 3
      Temp+"Mars"
    Case 4
      Temp+"Avril"
    Case 5
      Temp+"Mai"
    Case 6
      Temp+"Juin"
    Case 7
      Temp+"Juillet"
    Case 8
      Temp+"Aout"
    Case 9
      Temp+"Septembre"
    Case 10
      Temp+"Octobre"
    Case 11
      Temp+"Novembre"
    Case 12
      Temp+"Décembre"
  EndSelect
  
  Temp+FormatDate(" %yyyy",date) 
  
  ProcedureReturn Temp
EndProcedure

Procedure Week(date);/ Renvoie le n° de la semaine de la date donnée en paramètre
  
  Compteur=Date(Year(date),1,1,0,0,1) ;/ Jour de l'an
  
  ;/ On se positionne au 1° Lundi après le jour de l'an
  Repeat
    If DayOfWeek(Compteur)=1 : Break : EndIf
    Compteur=AddDate(Compteur,#PB_Date_Day,1)
  ForEver

  ;/ On incrément d'une semaine / à chaque fois on teste si dépassement de la date donnée
  Repeat
    ; Debug FrenchDate(Compteur)
    If Compteur>date : Break : EndIf
    Compteur=AddDate(Compteur,#PB_Date_Week,1)
    Semaine+1
   ForEver
  
  ProcedureReturn Semaine
EndProcedure
  
;/ Test  
MessageRequester("Test Date","Semaine n° "+Str(Week(Date()))+#CRLF$+FrenchDate(Date()),#MB_ICONINFORMATION)

Publié : mar. 04/oct./2005 19:03
par Dr. Dri
tu devrais utiliser un tableau, ca simplifierai pas mal de choses...

Dri

Publié : mar. 04/oct./2005 22:07
par Droopy
Je vois pas comment

Publié : mer. 05/oct./2005 8:09
par lionel_om

Code : Tout sélectionner

Dim Jour.s(7)

Restore jour_nom
For i = 0 to 6
   Read Jour(i)
Next i

Debug DayOfWeek(Date())

DataSection
jour_nom:
  Data.s "Lundi", "Mardi", ..., "Dimanche"
EndDataSection

Lionel
:wink:

Publié : mer. 05/oct./2005 9:00
par Droopy
Ca n'optimise pas le code ça

Publié : mer. 05/oct./2005 12:48
par lionel_om
Bah si.

Ou sinon :

Code : Tout sélectionner

jour$ = "lundi;mardi;mercrdedi;...anche"
Debug StringField(jour$, DayOfWeek(Date())+1, ";")

Publié : ven. 07/oct./2005 19:53
par Flype
pour la version avec un tableau voici une application :

Code : Tout sélectionner

Dim jour.s(6)
jour(0) = "dimanche"
jour(1) = "lundi" 
jour(2) = "mardi" 
jour(3) = "mercredi"
jour(4) = "jeudi" 
jour(5) = "vendredi" 
jour(6) = "samedi" 

Dim mois.s(11)
mois(0)  = "janvier" 
mois(1)  = "février" 
mois(2)  = "mars" 
mois(3)  = "avril" 
mois(4)  = "Mai" 
mois(5)  = "juin" 
mois(6)  = "juillet" 
mois(7)  = "aout" 
mois(8)  = "septembre" 
mois(9)  = "octobre" 
mois(10) = "novembre" 
mois(11) = "décembre"  

Procedure.s FrenchDate(date.l)
  
  Protected date.l, sRes.s
  
  sRes = FormatDate("%0 %1 %2 %yyyy",date) 
  sRes = ReplaceString(sRes,"%0",jour(DayOfWeek(date)))
  sRes = ReplaceString(sRes,"%1",Str(Day(date)))
  sRes = ReplaceString(sRes,"%2",mois(Month(date)-1))
  
  ProcedureReturn sRes
  
EndProcedure

Publié : ven. 07/oct./2005 20:02
par Flype
et pour une date multilingue je viens de faire çà :

Code : Tout sélectionner

Procedure.s LocaleDate(date.l,lang.s)
  
  Protected date.l, lang.s, lcid.l, sRes.s, st.SYSTEMTIME
  
  st\wYear   = Year(date)
  st\wMonth  = Month(date)
  st\wDay    = Day(date)
  st\wHour   = Hour(date)
  st\wMinute = Minute(date)
  st\wSecond = Second(date)
  
  Select lang
    Case "de" : lcid = #LANG_GERMAN
    Case "en" : lcid = #LANG_ENGLISH
    Case "fr" : lcid = #LANG_FRENCH
    Case "it" : lcid = #LANG_ITALIAN
    Case "po" : lcid = #LANG_PORTUGUESE
    Case "sp" : lcid = #LANG_SPANISH
    Case "tu" : lcid = #LANG_TURKISH
  EndSelect
  
  sRes = Space(255)
  GetDateFormat_(lcid,0,st,"dddd, d MMMM yyyy",sRes,255)
  
  ProcedureReturn sRes
  
EndProcedure

For i=1 To 8
  
  lang.s = StringField("de,en,fr,it,po,sp,tu,",i,",")
  
  MessageRequester("LocaleDate("+lang+")",LocaleDate(Date(),lang))
  
Next

Publié : ven. 07/oct./2005 20:33
par Droopy
Nickel ton code multilingue Flype ! :D

et l'autre aussi :wink:

Publié : ven. 07/oct./2005 22:16
par Dr. Dri
@Flype

Pourquoi ne pas directement utiliser les constantes au lieu de passer par une chaine ?

Dri

Publié : sam. 08/oct./2005 8:00
par Droopy
J'ai modifié légèrement le code de Flype pour pouvoir spécifier le masque.
et utilisé comme Dri le préconisait, des constantes.

Code : Tout sélectionner

;/ Author Flype
; 07/10/05

;/ Format of Mask
; d	    Day of month as digits with no leading zero For single-digit days.
; dd	  Day of month as digits with leading zero For single-digit days.
; ddd	  Day of week as a three-letter abbreviation. The function uses The LOCALE_SABBREVDAYNAME value associated with The specified locale.
; dddd	Day of week as its full name. The function uses The LOCALE_SDAYNAME value associated with The specified locale.
; M	    month as digits with no leading zero For single-digit months.
; MM	  month as digits with leading zero For single-digit months.
; MMM	  month as a three-letter abbreviation. The function uses The LOCALE_SABBREVMONTHNAME value associated with The specified locale.
; MMMM	month as its full name. The function uses The LOCALE_SMONTHNAME value associated with The specified locale.
; y	    Year as last two digits, but with no leading zero For years less than 10.
; yy	  Year as last two digits, but with leading zero For years less than 10.
; yyyy	Year represented by full four digits.

;/ Language ( 0 specify locale )
; #LANG_GERMAN / #LANG_ENGLISH / #LANG_FRENCH  /#LANG_ITALIAN / #LANG_PORTUGUESE / #LANG_SPANISH / #LANG_TURKISH 


Procedure.s LocaleDate(Mask.s,date.l,lang.l) 
  
  Protected date.l, lang.l, lcid.l, sRes.s, st.SYSTEMTIME 
  
  st\wYear   = Year(date) 
  st\wMonth  = Month(date) 
  st\wDay    = Day(date) 
  st\wHour   = Hour(date) 
  st\wMinute = Minute(date) 
  st\wSecond = Second(date) 
  
  sRes = Space(255) 
  GetDateFormat_(lang,0,st,Mask,sRes,255) 
  
  ProcedureReturn sRes 
  
EndProcedure 

;/ Test
Temp.s="Italian : "+LocaleDate("dddd d MMMM yyyy gg",Date(),#LANG_ITALIAN)+#CRLF$
Temp.s+"Spanish : "+LocaleDate("dddd d MMMM yyyy gg",Date(),#LANG_SPANISH)+#CRLF$
Temp.s+"Local : "+LocaleDate("dddd d MMMM yyyy gg",Date(),0)

MessageRequester("Locale Date",Temp)

Publié : sam. 08/oct./2005 10:47
par Flype
coucou, j'ai rien contre les constantes au contraire.
c'est juste que j'en avais besoin pour interpréter des flux RSS dans lesquels le langage est spécifié sous la forme ISO standard "fr", "en", ou "en-uk", "en-us" pour les sous langages. voilà.
d'ailleurs je suis en train d'élaborer une lib RSS utilisant PBOSL/MSXML3 et une lib perso de date appelé GMT... dont je vais poster ici des morceaux.

Publié : sam. 08/oct./2005 12:32
par Flype
donc voilà qq fonctions de date supplémentaires.
bon attention çà servira pas à tout le monde. sachez juste que les dates au format RFC822 sont utilisées dans les emails, les fils RSS, sur internet en général. Les dates ISO8601 sont utilisées sur internet aussi, dans les fils RSS/RDF...

Code : Tout sélectionner

;-
;- Fonctions GMT, RFC822, ISO8601
;-

Enumeration -1 ; #TIME_ZONE_ID_
  #TIME_ZONE_ID_INVALID
  #TIME_ZONE_ID_UNKNOWN
  #TIME_ZONE_ID_STANDARD
  #TIME_ZONE_ID_DAYLIGHT
EndEnumeration

Procedure.l Bias()
  
  ; Retourne la différence de temps (en minutes) entre la date GMT et la date locale.
  
  Protected a.TIME_ZONE_INFORMATION, lRes.l
  
  Select GetTimeZoneInformation_(a.TIME_ZONE_INFORMATION)
    Case #TIME_ZONE_ID_STANDARD
      If a\StandardDate\wMonth
        lRes = a\StandardBias
      EndIf
    Case #TIME_ZONE_ID_DAYLIGHT
      If a\DaylightDate\wMonth
        lRes = a\DaylightBias
      EndIf
  EndSelect
  
  lRes + a\Bias
  
  ProcedureReturn lRes
  
EndProcedure
Procedure.s TimeZone()
  
  ; Retourne la différence de temps (+/-0000) entre la date GMT et la date locale.
  
  Protected tz.s
  
  If Bias() > 0
    tz = "-"
  Else
    tz = "+"
  EndIf
  
  tz + RSet(Str(Abs(Bias())/0.6),4,"0")
  
  ProcedureReturn tz
  
EndProcedure

Procedure.l Gmt(date.l)
  
  ; Retourne la date spécifiée, avec la correction GMT.
  
  Protected date.l, lRes.l
  
  lRes = AddDate(date,#PB_Date_Minute,Bias())
  
  ProcedureReturn lRes
  
EndProcedure
Procedure.l LCID(lang.b,sublang.b)
  
  ; Retourne une valeur LCID utilisable avec GetDateFormat() par ex. 
  
  Protected lang.b, sublang.b, lRes.l
  
  lRes = (#SORT_DEFAULT<<16) | ( (sublang<<10) | lang )
  
  ProcedureReturn lRes
  
EndProcedure

Procedure.s FormatDate_Win32(Mask.s,date.l,lang.l,sublang.l) 
  
  ; Retourne une date formatée par l'API Win32.
  
  Protected Mask.s, date.l, lang.l, sublang.l, sRes.s, a.SYSTEMTIME 
  
  a\wYear  = Year(date) 
  a\wMonth = Month(date) 
  a\wDay   = Day(date) 
  
  sRes = Space(255)
  GetDateFormat_(LCID(lang,sublang),0,a,Mask,sRes,255)
  
  ProcedureReturn sRes 
  
EndProcedure 
Procedure.s FormatDate_Rfc822(date.l,mode.b)
  
  ; Retourne la date spécifiée en respectant la norme RFC-822.
  
  Protected date.l, mode.b, tz.s, sRes.s
  
  If mode
    tz = "GMT" : date = Gmt(date)
  Else
    tz = TimeZone()
  EndIf
  
  sRes = FormatDate_Win32("ddd, d MMM yyyy ",date,#LANG_ENGLISH,#SUBLANG_ENGLISH_UK)
  sRes + FormatDate("%hh:%ii:%ss ",date) + tz
  
  ProcedureReturn sRes
  
EndProcedure
Procedure.s FormatDate_Iso8601(date.l,mode.b)
  
  ; Retourne la date spécifiée en respectant la norme ISO-8601.
  
  Protected date.l, mode.b, tz.s, sRes.s
  
  If mode
    tz = "Z" : date = Gmt(date)
  Else
    tz = TimeZone()
  EndIf
  
  sRes = FormatDate("%yyyy-%mm-%ddT%hh:%ii:%ss",date) + tz
  
  ProcedureReturn sRes
  
EndProcedure

Procedure.l ParseDate_Rfc822(rfc.s)
  
  ; Retourne la date interprétée depuis une date à la norme RFC-822.
  
  Protected rfc.s, tz.s, sTmp.s, lRes.l, a.SYSTEMTIME
  
  If FindString(rfc,",",1) = 0
    rfc = "Mon, " + rfc
  EndIf
  
  For i=1 To 5
    sTmp + StringField(rfc,i," ") + " "
  Next
  
  If InternetTimeToSystemTime_(sTmp,a,0)
    
    tz = StringField(rfc,6," ")
    
    Select tz
      Case ""    : tz = "+0000"
      Case "UT"  : tz = "+0000"
      Case "GMT" : tz = "+0000"
      Case "EST" : tz = "-0500"
      Case "EDT" : tz = "-0400"
      Case "CST" : tz = "-0600"
      Case "CDT" : tz = "-0500"
      Case "MST" : tz = "-0700"
      Case "MDT" : tz = "-0600"
      Case "PST" : tz = "-0800"
      Case "PDT" : tz = "-0700"
      Case "A"   : tz = "-0100"
      Case "B"   : tz = "-0200"
      Case "C"   : tz = "-0300"
      Case "D"   : tz = "-0400"
      Case "E"   : tz = "-0500"
      Case "F"   : tz = "-0600"
      Case "G"   : tz = "-0700"
      Case "H"   : tz = "-0800"
      Case "I"   : tz = "-0900"
      Case "K"   : tz = "-1000"
      Case "L"   : tz = "-1100"
      Case "M"   : tz = "-1200"
      Case "N"   : tz = "+0100"
      Case "O"   : tz = "+0200"
      Case "P"   : tz = "+0300"
      Case "Q"   : tz = "+0400"
      Case "R"   : tz = "+0500"
      Case "S"   : tz = "+0600"
      Case "T"   : tz = "+0700"
      Case "U"   : tz = "+0800"
      Case "V"   : tz = "+0900"
      Case "W"   : tz = "+1000"
      Case "X"   : tz = "+1100"
      Case "Y"   : tz = "+1200"
    EndSelect
    
    lRes = Date(a\wYear,a\wMonth,a\wDay,a\wHour,a\wMinute,a\wSecond)
    lRes = AddDate(lRes,#PB_Date_Minute,-Val(tz)*0.6)
    lRes = AddDate(lRes,#PB_Date_Minute,-Bias())
    
  EndIf
  
  ProcedureReturn lRes
  
EndProcedure
Procedure.l ParseDate_Iso8601(iso.s)
  
  ; Retourne la date interprétée depuis une date à la norme ISO-8601.
  
  Protected iso.s, tz.s, lRes.l
  
  tz = Mid(iso,20,Len(iso)-19)
  
  If tz = "Z"
    tz = "+0000"
  EndIf
  
  lRes = ParseDate("%yyyy-%mm-%ddT%hh:%ii:%ssZ",iso)
  lRes = AddDate(lRes,#PB_Date_Minute,-Val(tz)*0.6)
  lRes = AddDate(lRes,#PB_Date_Minute,-Bias())
  
  ProcedureReturn lRes
  
EndProcedure

;-

Mask.s = "%dd/%mm/%yyyy %hh:%ii:%ss"
date.l = Date(2005,10,1,1,0,0)
rfc1.s = FormatDate_Rfc822(date,0)
rfc2.s = FormatDate_Rfc822(date,1)
iso1.s = FormatDate_Iso8601(date,0)
iso2.s = FormatDate_Iso8601(date,1)

Debug ""
Debug "TEST GMT"
Debug Bias()
Debug TimeZone()
Debug FormatDate(Mask,date)
Debug FormatDate(Mask,Gmt(date))

Debug ""
Debug "TEST RFC-822"
Debug rfc1
Debug rfc2
Debug FormatDate(Mask,ParseDate_Rfc822(rfc1))
Debug FormatDate(Mask,ParseDate_Rfc822(rfc2))

Debug ""
Debug "TEST ISO-8601"
Debug iso1
Debug iso2
Debug FormatDate(Mask,ParseDate_Iso8601(iso1))
Debug FormatDate(Mask,ParseDate_Iso8601(iso2))

Publié : sam. 15/oct./2005 22:32
par Dr. Dri
J'ai bien aimé ton code Flype mais là j'ai besoin de ton aide ^^
j'ai réussi à trouver (et pas sans mal 8O) comment obtenir le code d'un langage a partir d'un LCID (comme pour ton truc en xml) mais pas l'inverse.

Code : Tout sélectionner

#LOCALE_SISO639LANGNAME = $59

Procedure.s GetISO639LangName(Locale.l)
  chaine.s = Space(6)
  GetLocaleInfo_(Locale, #LOCALE_SISO639LANGNAME, @chaine, 7)
  ProcedureReturn chaine
EndProcedure

Debug GetISO639LangName(#LANG_ENGLISH)
Debug GetISO639LangName(#LANG_FRENCH)
Debug GetISO639LangName(#LANG_GERMAN)
j'aimerai faire la même chose dans le sens inverse... en gros GetMonInfoPliz_("fr", autres params ki me dérangent pas) qui retournerai d'une manière ou d'une autre la valeur de #LANG_FRENCH
une piste ?

Dri