Kabuk betiğinde YYYY-AA-GG biçiminde tarih


1111

$(date)Benim bash kabuk betiğimi kullanmayı denedim , ancak tarih YYYY-MM-DDbiçiminde istiyorum .
Bunu nasıl alabilirim?

Yanıtlar:


1830

Bash'de (> = 4.2) harici date(genellikle GNU tarihi) yerine printf'in yerleşik tarih biçimlendiricisinin (bash'ın bir parçası) kullanılması tercih edilir .

Gibi:

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal

Bash'ta (<4.2):

# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')

# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# print current date directly
echo $(date '+%Y-%m-%d')

Diğer kullanılabilir tarih biçimleri tarih el kitabı sayfalarından görüntülenebilir (bash'a özgü olmayan harici komut için):

man date

4
Ayın ilk günlerinde OP'nin istediği şey "2012-07-1" olsun.
DerMike

6
Bu benim için çalışıyor. Man sayfası ayın ilkinin 01, no 1 (Ör. 2012-07-01) olduğunu göstermektedir.
Bob Kuhar

31
TARİH = $ (tarih +% d-% m-% Y ""% H:% M:% S); Sonra ne buldum.
JacopKane

5
Bu kısayolların ne kadar yaygın olduğunu kontrol etmedim, ancak bazı dağıtımlarda +%F %Tkısayol olarak kullanabilirsiniz +%Y-%m-%d %H:%M:%S. O sadece not bazı dosya sistemleri (öksürük ** HFS) dönüştürür :a /size gibi bir dize vererek 2016-09-15 11/05/00hangi kafa karıştırıcı güçlüdür.
beporter

24
Bu binyılda herhangi bir POSIX uyumlu kabukta tercih edilen sözdizimi date=$(date)yerine date=`date`. Ayrıca, özel değişkenleriniz için büyük harf kullanmayın; büyük harfli değişken adları sistem için ayrılmıştır.
tripleee

335

Deneyin: $(date +%F)


12
Tarih için man sayfaları şu şekildedir:% F tam tarih; % Y-% m-% d ile aynıdır, bu nedenle bu kabul edilen cevap için daha kompakt bir gösterimdir.
Håvard Geithus


47

ISO 8601 standart tarih biçimini arıyorsunuz , bu nedenle GNU tarihiniz varsa (veya 1988'den daha modern bir tarih komutunuz varsa) şunları yapın:$(date -I)


9
Yeni (> 1988) bir Mac OS X bilgisayarım var ve date -Içalışmadı. Yüklü olması GNU coreutils kullanılarak demlemek (önek 'g' kullanır) gdate -Iyaptığı iş.
Joel Purra

3
Garip. -IGNU için belgelenmiş seçeneği bulamıyorum date, ancak yeterince eşdeğer görünüyor date +%F.
chepner

3
OS X genellikle bir GPL v3 arazisidir, bu nedenle yakın zamanda güncellenmiş tarih veya BASH olmayabilir.
Aralık'ta 13:50

20
date -d '1 hour ago' '+%Y-%m-%d'

Çıktı olurdu 2015-06-14.


3
Birkaç nedenden dolayı yanlış, açıkçası bu 00:00 ila 01:00 arasında yanlış tarih veriyor ve bunun yanında a ile bitiyor %.
Gerhard Burger

bu doğru değil. bu seyrek tek alıntı gibi olmalı
Beyhan Gül

20
$(date +%F_%H-%M-%S)

iki nokta üst üste (:) kaldırmak için kullanılabilir

çıktı

2018-06-20_09-55-58

19

En son Bash (sürüm ≥ 4.2) ile, yerleşikliği printfformat değiştiriciyle kullanabilirsiniz %(strftime_format)T:

$ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1  # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1  # Capture as var $date

printfharici bir komut dateiken Bash yerleşik olduğundan daha hızlıdır date.

Ayrıca, bir alt kabuk çatal gerektirmediğinden printf -v date ...daha hızlıdır date=$(printf ...).


4
2019'da bir not olarak, bu komut, dateherhangi bir ekstra kütüphane yüklemek zorunda olmadığından, bunu zaten bir bash betiğinden kullanmanızdan inanılmaz derecede daha hızlıdır . (* Linux sunucumda 1000 yinelemede ~ 160x hız farkı
ölçtüm

@timtj Bunu işaret ettiğiniz için teşekkürler! Cevaba hız hakkında bazı notlar ekledim.
wjandrea

1
Ben printf -v datebir subshell çatal değil hakkında yorum için +5 keşke . Çok iyi bilgi !!
timtj

Genellikle tarihi kullanırım çünkü bazı tarihleri ​​artırmam gerekir. Printf tarih aritmetiği yapabilir mi?
Merlin

1
@Merlin Ben öyle düşünmüyorum
wjandrea

8

Böyle bir görevim olduğunda geri dönüyorum

$ man strftime

kendime tüm olasılıkları hatırlatmak için.


7

Yılı 2017 yerine 17 gibi iki sayı biçiminde istiyorsanız, aşağıdakileri yapın:

DATE=`date +%d-%m-%y`

6
#!/bin/bash -e

x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

Burada x, kullanılan örnek tarihtir ve sonra hem verilerin biçimlendirilmesini hem de geçerli tarihten 10 dakika daha fazla tarih almayı görüntüler.


6

Aşağıdaki formülasyonu kullanıyorum:

TODAY=`date -I`
echo $TODAY

Man sayfasını kontrol edin date, başka kullanışlı seçenekler de vardır:

man date

5

Ben $(date +"%Y-%m-%d") ya $(date +"%Y-%m-%d %T")da zaman ve saat kullanıyorum.


1

Tarihi ortam değişkeni olarak ayarlayabilirsiniz ve daha sonra u kullanabilirsiniz

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

veya

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.