UTC en heure légale

UTC en heure légale - Shell/Batch - Programmation

Marsh Posté le 30-03-2015 à 11:30:50    

Bonjour,
 
Novice en programmation shell, je me tourne vers le forum pour avoir de l'aide.
 
J'ai un fichier xml où toutes les dates du fichiers sont en Temps universel, je voudrais les convertir en heure légale automatiquement est-ce possible ?
 
Merci

Reply

Marsh Posté le 30-03-2015 à 11:30:50   

Reply

Marsh Posté le 30-03-2015 à 11:48:56    

Oui, c'est faisable.
Elles sont entre des tags spécifiques, tes dates?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-03-2015 à 14:49:51    

Voici un aperçu du fichier :
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE opalXML:opalXML SYSTEM "opalxml3.dtd">
<opalXML:opalXML>
 <opalXML:CONFIGURATION date="2014-12-10 09:36:06">
  <opalXML:STATIONGROUP Name="ADOUR MOYEN">
   <opalXML:STATION Id="-32767" Name="Aire">
    <opalXML:SENSOR Id="34" Name="" Type="2">
    </opalXML:SENSOR>
</opalXML:CONFIGURATION>
 <opalXML:MEASURELIST date="2014-12-10 09:36:06">
  <opalXML:MEASURE TS="2014-12-10 09:15:00" Type="limni" Station="Aire" Value="1.221" />
  <opalXML:MEASURE TS="2014-12-10 09:30:00" Type="limni" Station="Aire" Value="1.219" />
---------------------------------------
En bref, j'aimerais convertir en heure léhale les dates des attibuts "date" et "TS" actuellement en temps universel. J'espère que ça illustre m'a demande correctement.
 
Merci
 

Reply

Marsh Posté le 31-03-2015 à 17:44:37    

En perl, on pourrait faire ainsi:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. use Time::Local;
  6.  
  7.  
  8. sub UTC2local {
  9.  my $name = shift;
  10.  # conversion en nombre de secondes depuis 'the epoch', le zero de référence unix/linux avec timegm
  11.  # puis reconversion en temps local (en fonction de la timezone de la machine ou s'exécute le script) avec localtime
  12.  my ($sec, $min, $hour, $day, $month, $year) = (localtime(timegm(@_)))[0..5];
  13.  $year += 1900;
  14.  $month++;
  15.  return (sprintf("%s=\"%04d-%02d-%02d %02d:%02d:%02d\"", $name, $year, $month, $day, $hour, $min, $sec));
  16. }
  17.  
  18. open my $fhin, "<", "utc.txt";
  19. open my $fhout, ">", "ltc.txt";
  20. while (<$fhin> ) {
  21.  s/(?<=\s)(date|TS)="(\d{4})\-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})"/UTC2local($1, $7, $6, $5, $4, $3 - 1, $2)/ge;
  22.  print $fhout $_;
  23. }
  24. close $fhout;
  25. close $fhin;


Il y a probablement moyen de ne pas passer le nom de l'attribut à UTC2local, si on veut optimiser.
 
EDIT: Une version un poil plus optimale:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. use Time::Local;
  6.  
  7. sub UTC2local {
  8.  # conversion en nombre de secondes depuis 'the epoch', le zero de référence unix/linux
  9.  # puis reconversion en temps local (en fonction de la timezone de la machine ou s'exécute le script)
  10.  my @ltime = reverse((localtime(timegm(reverse(@_))))[0..5]);
  11.  # reverse en entrée et sortie parce que timegm et localtime sont dans l'ordre (sec, min, hour, day, month, year)
  12.  $ltime[0] += 1900; # car localtime retourne le nb d'annes depuis 1900
  13.  $ltime[1]++; # pour repasser de mois variant de 0 a 11 a des mois variant de 1 a 12
  14.  return sprintf("%04d-%02d-%02d %02d:%02d:%02d", @ltime);
  15. }
  16.  
  17. open my $fhin, "<", "utc.txt";
  18. open my $fhout, ">", "ltc.txt";
  19. while (<$fhin> ) {
  20.  # $3 - 1  car les mois utilisés par localtime et timegm varient entre 0 et 11
  21.  s/(?<=\s)(TS|date)="(\d{4})\-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})"/"$1=\"".UTC2local($2, $3 - 1, $4, $5, $6, $7).'"'/ge;
  22.  print $fhout $_;
  23. }
  24. close $fhout;
  25. close $fhin;


 
A+,


Message édité par gilou le 01-04-2015 à 00:46:07

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed