# Creation d'une date sur applescript



## CathyGYM (4 Décembre 2010)

Bonsoir,
je continue lentement mon apprentissage d'Applescript, et je suis en train de faire un script qui crée des évènements iCal à partir d'un fichier texte contenant un planning (mon planning du boulot !). La lecture du fichier texte s'effectue sans aucun problème... mais la création de l'évènement ical bloque car je lui transmet une date sous forme de chaine ; l'instruction que j'emploie est la suivante :

tell application "iCal"
	tell calendar "Travail"
		make new event at end with properties {description:descriptEv, summary:ObjetEv, location:LieuEv, start date:dateDebEvent, end date:dateFinEvent}
	end tell
end tell

Toutes les variables DescriptEv, ObjetEv, LieuEv, dateDebEvent et dateFinEvent sont des chaines de caractères définies plus haut dans le script et validées par des display dialog (dateDebEvent vaut "2010-12-21 06:00:00" et dateFinEvent vaut "2010-12-21 07:30:00")

Comme celà plantait, j'ai essayé de créer une date, et de lui modifier les propriétés "date string" et "time string" de façon à récuperer les bonnes dates en format date, mais celà plante encore (message saturation de pile). 

set DateDeb to my TransfoDate(DateDebEvent)
set DateFin to my TransfoDate(DateFinEvent)
.
.
.
on TransfoDate(ChaineDate)
    set DateLoc to text 1 thru 10 of ChaineDate
    set HeureLoc to text 11 thru end of ChaineDate
    set DateTransfo to current date
    set date string of DateTransfo to DateLoc
    set time string of DateTransfo to HeureLoc
    return DateTransfo
end TransfoDate

Quelqu'un pourrait-il me dire ce qui cloche ?
Question subsidiaire : existe-t-il une fonction qui permet d'éliminer les espaces en début ou en fin de chaine (un peu comme le "trim" de real basic?)

Merci d'avance


----------



## Anonyme (5 Décembre 2010)

Bonjour,

Si ton format de date dans les préférences systèmes --> International --> "*Formats*" est comme cette chaîne "*2010-12-21 06:00:00*", il suffit de faire comme ceci* :

```
set dateDeb to date "2010-12-21 06:00:00"
```

Sinon il faut récupérer les nombres.
date string et time string ne sont pas des propriétés d'une date, mais une fonction qui convertit une partie de l'objet date en texte.

```
set DateDeb to my stringToDate("2010-12-21 06:00:00")
set DateFin to my stringToDate("2010-12-21 07:30:00")

on stringToDate(theString)
	try
		tell theString to set tList to {text 1 thru 4, text 6 thru 7, text 9 thru 10, text 12 thru 13, text 15 thru 16, text 18 thru 19}
		tell (current date)
			set {its year, its month, its day, its hours, its minutes, its seconds} to tList
			return it
		end tell
	on error
		return "Le texte ne contient pas une date valide"
	end try
end stringToDate
```


Il n'existe pas de fonction *trim* en AppleScript.
Mais c'est possible d'utiliser un shell ou d'ajouter une routine dans ton script.

Exemple de routine qui supprime-les (espaces et tabulation) au début et  à la fin d'une chaîne

```
set mon_texte to "  	  foo   éèà:bar:   bar:foo  		"
set mon_texte to my delete_Space_Tab(mon_texte)

on delete_Space_Tab(T)
	repeat while character 1 of T is in " 	"
		set T to T's text 2 thru -1
	end repeat
	repeat while last character of T is in " 	"
		set T to T's text 1 thru -2
	end repeat
	return T
end delete_Space_Tab
```

Exemple qui utilise un do shell script

```
set mon_texte to "  	  foo   éèà:bar:   bar:foo  		"
set mon_texte to my delete_trailing_leading_whiteSpaces(mon_texte)

on delete_trailing_leading_whiteSpaces(T)
	do shell script "var=" & quoted form of T & "; var=\"${var#${var%%[![:space:]]*}}\"; echo \"${var%${var##*[![:space:]]}}\""
end delete_trailing_leading_whiteSpaces
```
Voici d'autres  commandes do shell script alternatives

```
do shell script "/usr/bin/sed -E  \"s/^[[:space:]]*//;s/[[:space:]]*$//\" <<<" & quoted form of T
	-- ou ceci-- do shell script "/usr/bin/php -r " & (quoted form of "print trim($argv[1]);") & " " & quoted form of T
```


----------



## CathyGYM (5 Décembre 2010)

Merci beaucoup Mac_Jac, j'ai testé çà marche super...
J'avais détecté un problème du aux espaces en début de chaine et en j'avais fait une première procédure pour éliminer les espaces (avant et après, un peu comme la fonction trim de VB et RB), mais la tienne est mieux car elle tient compte des tabs, ce à quoi je n'avais pas pensé...
Je donne quand même le code de ma procédure, çà pourra peut-être servir à d'autres :

-- Procédure de suppression des espaces en début et fin de chaine de caractères
on trim(ChaineLoc)
    if ((length of ChaineLoc) is not equal to 0) then
        repeat
            if character 1 of ChaineLoc is equal to " " then
                set ChaineLoc to text 2 thru end of ChaineLoc
            else
                exit repeat
            end if
        end repeat
        repeat
            if last character of ChaineLoc is equal to " " then
                set ChaineLoc to text 1 thru ((length of ChaineLoc) - 1) of ChaineLoc
            else
                exit repeat
            end if
        end repeat
    end if
    return ChaineLoc
end trim

Merci encore


----------

