Hi,
i know ParseDate() but how can i parse dates like Tue, 14 May 2013 13:40:50 GMT into 14.05.13 or something like this? Regular expressions?
Thanks,
PHP
Parse dates like Tue, 14 May 2013 13:40:50 GMT
-
- Addict
- Posts: 4777
- Joined: Thu Jun 07, 2007 3:25 pm
- Location: Berlin, Germany
Re: Parse dates like Tue, 14 May 2013 13:40:50 GMT
A pretty simple way is to use StringField(), e.g. like in the following code. Other ways are also possible, of course.
After parsing the date, you can further process the separate components, using e.g. Val() etc.
Code: Select all
EnableExplicit
Structure MyTime
weekday$
day$
month$
year$
hour$
minute$
second$
zone$
EndStructure
Procedure ParseMyDate (myDate$, *parsed.MyTime)
; -- parse a given date
; in : myDate$: date in the form "Tue, 14 May 2013 13:40:50 GMT"
; out: *parsed: structured variable that contains the separate components of the date
Protected rest$
With *parsed
\weekday$ = StringField(myDate$, 1, ",")
rest$ = LTrim(StringField(myDate$, 2, ","))
\day$ = StringField(rest$, 1, " ")
\month$ = StringField(rest$, 2, " ")
\year$ = StringField(rest$, 3, " ")
\zone$ = StringField(rest$, 5, " ")
rest$ = StringField(rest$, 4, " ")
\hour$ = StringField(rest$, 1, ":")
\minute$ = StringField(rest$, 2, ":")
\second$ = StringField(rest$, 3, ":")
EndWith
EndProcedure
;-- Demo
Define parsed.MyTime
ParseMyDate("Tue, 14 May 2013 13:40:50 GMT", parsed)
With parsed
Debug "'" + \weekday$ + "'"
Debug "'" + \day$ + "'"
Debug "'" + \month$ + "'"
Debug "'" + \year$ + "'"
Debug "'" + \hour$ + "'"
Debug "'" + \minute$ + "'"
Debug "'" + \second$ + "'"
Debug "'" + \zone$ + "'"
EndWith
Re: Parse dates like Tue, 14 May 2013 13:40:50 GMT
Great solution John, thanks for this!
-
- Addict
- Posts: 4777
- Joined: Thu Jun 07, 2007 3:25 pm
- Location: Berlin, Germany
Re: Parse dates like Tue, 14 May 2013 13:40:50 GMT
You are welcome!
A disadvantage of the above solution is, that it's not robust. I.e. if for instance some items are separated by 2 blanks instead of 1 blank, then it will fail.
Here is a pretty versatile and robust function, based on srod's Tokenizer. All credits go to srod, all mistakes are hand-crafted by me.
A disadvantage of the above solution is, that it's not robust. I.e. if for instance some items are separated by 2 blanks instead of 1 blank, then it will fail.
Here is a pretty versatile and robust function, based on srod's Tokenizer. All credits go to srod, all mistakes are hand-crafted by me.

Code: Select all
EnableExplicit
Procedure.i SplitString (line$, separator$, List token$())
; in : line$ : Text to be split
; separator$: List of characters that act as delimiters
; out: token$() : List of substrings which are delimited by
; any characters in separator$
; return value: #False if 'line$' cannot be parsed, and
; #True otherwise
Protected char$, left, right, length, result=#True
left = 1
right = 1
length = Len(line$)
ClearList(token$())
While right <= length
char$ = Mid(line$, right, 1)
If FindString(separator$, char$, 1)
If left < right
AddElement(token$())
token$() = Mid(line$, left, right-left)
left = right
Else
left + 1
right + 1
EndIf
ElseIf right = length
right + 1
AddElement(token$())
token$() = Mid(line$, left, right-left)
Else
right + 1
EndIf
Wend
ProcedureReturn result
EndProcedure
;-- Demo
Macro SplitIt (_myDate_, _separators_)
If SplitString(_myDate_, _separators_, token$())
ForEach token$()
Debug "'" + token$() + "'"
Next
Else
Debug "Can't split '" + _myDate_ + "'."
EndIf
Debug "-------"
EndMacro
#MY_SEPARATORS = " ,:"
NewList token$()
; Splitting all the following strings will produce the same result:
SplitIt("Tue, 14 May 2013 13:40:50 GMT", #MY_SEPARATORS)
SplitIt("Tue 14 May 2013 13:40:50, GMT", #MY_SEPARATORS)
SplitIt("Tue 14 ,, May , 2013 13 : 40 : 50 GMT", #MY_SEPARATORS)
-
- Addict
- Posts: 4777
- Joined: Thu Jun 07, 2007 3:25 pm
- Location: Berlin, Germany
Re: Parse dates like Tue, 14 May 2013 13:40:50 GMT
This version uses a Regular Expression.
Code: Select all
EnableExplicit
Procedure.i ParseMyDate (myDate$, Array result$(1))
Protected regEx.i, ret.i=0
regEx = CreateRegularExpression(#PB_Any, "[^ ,:]+")
If regEx
ret = ExtractRegularExpression(regEx, myDate$, result$())
Else
result$(0) = RegularExpressionError()
EndIf
FreeRegularExpression(regEx)
ProcedureReturn ret
EndProcedure
;-- Demo
Macro SplitIt (_myDate_)
nbFound = ParseMyDate(_myDate_, result$())
If nbFound
For k = 0 To nbFound-1
Debug "'" + result$(k) + "'"
Next
Else
Debug "Can't split '" + _myDate_ + "'."
Debug result$(0)
EndIf
Debug "-------"
EndMacro
Define.i nbFound, k
Dim result$(0)
; Splitting all the following strings will produce the same result:
SplitIt("Tue, 14 May 2013 13:40:50 GMT")
SplitIt("Tue 14 May 2013 13:40:50, GMT")
SplitIt("Tue 14 ,, May , 2013 13 : 40 : 50 GMT")