Bu cevapta matematiksel ve eşleştirme işlemlerinin birbirine karışmasını sağlayan Perl, Python, Ruby, vb. Gibi bir betik dili kullanarak en az dirençli bir yol öneren bazı iyi ipuçları vardır .
İşte Perl ile hızlıca kesmek:
$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$
Bu basit örnekte, tarihin konumsal bileşenlerini yakalamak \d
için tekrar göstergesinin (örneğin) takip ettiği rakam karakter sınıfı ( ) {2}
kullanılır ve saat alanında kör olarak aritmetik yapıyoruz. Bu tür bir çözüm, yalnızca saat alanındaki basit aritmetik işlemlerin günün kaymasına neden olmayacağından emin olmak için yeterince bilginiz olduğunda uygundur.
Saat alanının @Lieven tarafından istendiği gibi taşması durumunda, doğru tarih / saat aritmetiğine değinmek için bu sorunun tekrar ele alınmasıyla, Perl çekirdek modülü Time::Piece
(Perl> 5.8) kullanılabilir:
$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
perl -MTime::Piece -pe \
's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
Time::Piece->strptime($1, "%Y-%m-%d %T") \
+ (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$
Bu örnek girdi, ertesi güne taşınan saat değerlerinin zarif bir şekilde ele alındığını göstermek için güncellendi. Time::Piece
Modül komut satırından çeker , tarih / saat girişinden eşleşir, Time::Piece
tarih / saat aritmetiği gerçekleştirmek için nesnelere dönüştürülür , ardından istenen çıktı formatına geri döndürülür.