8
votes

Comment puis-je faire une date à un intervalle de 15 minutes le plus proche dans Perl?

Je veux entourer l'heure actuelle jusqu'au 15 intervalle minute.
donc s'il est actuellement 6:07 , il serait lu 6: 15 comme heure de début.

Comment puis-je faire ça?


0 commentaires

4 Réponses :


11
votes

Vous pouvez diviser le temps en heures et minutes, puis utilisez la fonction CEIL comme: xxx


2 commentaires

Neat, mais 12:58 deviendra 12:60 et pas 13h00 :-(


Notez que cela ne tourne pas à 15 minutes près. Il avance le temps à la prochaine division de 15 minutes. Mais la question initiale souhaitait 7 à atteindre 15 ans, ce qui n'est pas non plus le plus proche.



11
votes

L'intervalle de 15 minutes le plus proche à 6:07 est 6:00, pas 6:15. Voulez-vous l'intervalle de 15 minutes le plus proche ou le prochain intervalle de 15 minutes?

En supposant que c'est le plus proche, quelque chose comme ça fait ce que vous voulez. P>

#!/usr/bin/perl

use strict;
use warnings;

use constant FIFTEEN_MINS => (15 * 60);

my $now = time;

if (my $diff = $now % FIFTEEN_MINS) {
  if ($diff < FIFTEEN_MINS / 2) {
    $now -= $diff;
  } else {
    $now += FIFTEEN_MINS - $diff;
  }
}

print scalar localtime $now, "\n";


0 commentaires


-1
votes

Variation mineure de la première réponse à l'aide de Sprintf au lieu de CEIL et POSIX. N'utilise également pas de modules CPAN supplémentaires. Ceci arrondit ou bas alors 6:07 = 6:00, 6:08 = 6:15, 6:22 = 6:15 et 6:23 = 6h30. Notez qu'une heure est ajoutée si les minutes arrondies sont égales 60. Cependant pour le faire correctement, vous devez utiliser une fonction Timelocal et localtime pour ajouter l'heure. c'est-à-dire ajouter une heure peut ajouter une journée, un mois ou une année.

  #!/usr/bin/perl  

  my ($hr,$min) = split/:/,$time;   

  my $interimval = ($min/15);

  my $rounded_min = sprintf "%.0f", $interimval;

  $rounded_min = $rounded_min * 15;

  if($rounded_min == 60) 

  {

     $rounded_min = 0;

     $hr++;

     $hr = 0 if($hr == 24); 

  }


0 commentaires