JavaScript'te biçim belirtimi ile dizeyi tarih saatine nasıl dönüştürebilirim?


208

Bir dize belirterek bir dizeyi javascript'teki bir tarih saati nesnesine nasıl dönüştürebilirim?

Gibi bir şey arıyorum:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");

2
BTW noktaları ve tireleri tarih ayırıcıları olarak başarısız olabilir, eğik çizgiler tamam, bu yüzden (testlerimin sınırlarına kadar) Javascript "2011/08/22 10:30:00" kabul edecek ancak henüz (ISO 8601'e rağmen) "2011-09 -02 15:58:40 "- iddia edildiği gibi - Javascript 1.8.5 sürümünde desteklenmektedir.
Dave Everitt

Date.parse işlevi, "aa / gg / yyyy" biçimindeki tarih dizesini ayrıştırır. Ayrıştırmayı uygulamadan önce lütfen dizeyi "aa / gg / yyyy" biçimine dönüştürün.

Tarihi neden gerekli biçimde vermiyorsunuz? Yeni Tarih gibi yapıyorum ('2012 11 25 18:00:00'); ve çalışıyor!
foxybagga

Yanıtlar:


88

Bunun size yardımcı olabileceğini düşünüyorum: http://www.mattkruse.com/javascript/date/

getDateFromFormat()Sorununuzu çözmek için biraz ayarlayabileceğiniz bir işlev var.

Güncelleme: Örneklerin güncellenmiş bir sürümü var javascripttoolbox.com


5
TypeError: Object Date has no method 'getDateFromFormat'
Derek 朕 會 功夫

6
GetDateFromFormat yöntemi, yukarıdaki bağlantıda doc ile kullanılabilir. Kaynak burada bulunabilir: mattkruse.com/javascript/date/source.html
Rafael Mueller

1
+1, iyi kütüphane ... saf javascript ... harika. teşekkür ederim
Surendra Jnawali

7
Her iki bağlantı da öldü
Sytham

1
Yapabiliyorsanız, lütfen bağlantıyı güncelleyin. Bu artık yardımcı olmuyor.
Tallerlei

98

Dizeniz ile uyumluysa kullanın . Biçiminiz uyumsuzsa (sanırım öyle), dizeyi kendiniz ayrıştırmalısınız (normal ifadelerle kolay olmalı) ve yıl, ay, tarih, saat, dakika ve saniye için açık değerlerle yeni bir Date nesnesi oluşturmanız gerekir .new Date(dateString)Date.parse()


1
Date.parse en iyi çözümdür! Neredeyse her şeyi ayrıştırıyor! +1
ianaz

7
@ianaz: ALMOST Amerika'da kullanılan her şeyi, ancak Avrupa'nın büyük bir kısmı tarafından kullanılan formatı eksik çok "neredeyse" çok büyük. Ancak yeni Tarih, özel işlevler için iyi bir temeldir.
Pavel V.

yeni Date (dateString) benim için iyi çalıştı, Date.parse () bunun yerine milisaniyeye dönüştürülür ve böylece Tarih türü değil bir sayı döndürür.
Reagan Ochora

68

@Christoph Sorunu çözmek için bir normal ifade kullanarak bahseder. İşte ne kullanıyorum:

var dateString = "2010-08-09 01:02:03";
var reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var dateArray = reggie.exec(dateString); 
var dateObject = new Date(
    (+dateArray[1]),
    (+dateArray[2])-1, // Careful, month starts at 0!
    (+dateArray[3]),
    (+dateArray[4]),
    (+dateArray[5]),
    (+dateArray[6])
);

Hiçbir şekilde akıllı değildir, sadece normal ifadeyi yapılandırın ve new Date(blah)ihtiyaçlarınıza uyacak şekilde yapılandırın .

Düzenleme: Belki yıkım kullanarak ES6'da biraz daha anlaşılır:

let dateString = "2010-08-09 01:02:03"
  , reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
  , [, year, month, day, hours, minutes, seconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds);

Ama bu günlerde dürüstlükle, Moment gibi bir şeye ulaşıyorum


19
@ bažmegakapa ağlamak yerine belki cevabı düzenleyebilir ve 'var's kendiniz?'
OrganicPanda

Neden /gyalnızca sonradan ayarlamak lastIndexiçin bayrağı kullanıyorsunuz 0? Sadece küresel bir maç kullanmayın.
Ry-

1
@minitech /gVarolan bir projeden özensiz bir kopyala / yapıştırdı. lastindexbir editör tarafından eklendi ( \gsanırım savaşmak için mi?). Şimdi onları kaldıracağım. Bunu işaret ettiğiniz için teşekkür ederim.
OrganicPanda

1
çok güzel
anwer ..

14

JavaScript'te gelişmiş tarih / saat biçimlendirme yordamı yoktur.

Biçimlendirilmiş tarih çıktısı için harici bir kütüphane kullanmanız gerekecek , Flagrant Badassery'den "JavaScript Tarih Biçimi" çok umut verici görünüyor.

Girdi dönüşümü için zaten birkaç öneri yapılmıştır. :)


3
"zorunda" görecelidir. Tabii ki kendi uygulamanızı oluşturabilirsiniz. :)
Tomalak

13

Moment.js'ye göz atın . JavaScript'in sıkıntılı Tarih işlevlerini (veya bunların eksikliğini) oluşturan modern ve güçlü bir kütüphanedir.


3
Ben aşağı itmedim, ama belki de Moment.js'de hangi işlevin istenen davranışı vereceğini bilmek güzel olurdu (bizim için zaten Moment.js kullanan, ancak kullanmak için belirli işlevi bilmeyen tembel insanlar) .
Matt

Yerelleştirme umut vericidir, nokta biçimi için herhangi bir orta avrupa yerel ayarı seçin. Ancak, test etmedim ve tam datetime biçimi gördüğüm örneklerde değil.
Pavel V.

Aşağı inmedim, ama sadece bunun yavaş olduğunu söylemek istedim. Masaüstü için uygun, ancak mobil cihazlar için çok yavaş olabilir (ihtiyaçlarınıza bağlı olarak).
gabn88

11

Sadece burada güncellenmiş bir cevap için, http://www.datejs.com/ adresinde iyi bir js lib var

Datejs, ayrıştırma, biçimlendirme ve işleme için açık kaynaklı bir JavaScript Tarih kütüphanesidir.


Bu düzenleme geri alındı, ancak çok yararlı olmasına rağmen, yorum veya ayrı bir cevap olarak eklenmelidir.
Alexis Abril

Zaten bir yorum yapmak çok uzun sürdü ve yinelenen bir cevap eklemek yanlış. Bu sorunun 155.000'den fazla görüşü var - bu kişilere mümkün olduğunca fazla bilgi verelim! (bu arada - Stack Overflow'da mevcut bir cevabı düzenlemek çok yaygındır - cevabınızı kopyaladıysam muhtemelen daha da kötü hissedersiniz ...)
Kobi

1
Her neyse, düzenlememi beğenmediyseniz, bu iyi, ancak lütfen cevabınızı genişletin - "Sadece burada güncellenmiş bir cevap için" bir dolgu maddesidir ve bazı ayrıntılar eksiktir. Bu soru şu anda dikkat çekiyor , bu arada aniden 5 oy almanızın nedeni bu.
Kobi

7
var temp1 = "";
var temp2 = "";

var str1 = fd; 
var str2 = td;

var dt1  = str1.substring(0,2);
var dt2  = str2.substring(0,2);

var mon1 = str1.substring(3,5);
var mon2 = str2.substring(3,5);

var yr1  = str1.substring(6,10);  
var yr2  = str2.substring(6,10); 

temp1 = mon1 + "/" + dt1 + "/" + yr1;
temp2 = mon2 + "/" + dt2 + "/" + yr2;

var cfd = Date.parse(temp1);
var ctd = Date.parse(temp2);

var date1 = new Date(cfd); 
var date2 = new Date(ctd);

if(date1 > date2) { 
    alert("FROM DATE SHOULD BE MORE THAN TO DATE");
}

5

Dış kütüphane bir ya da iki tarihi ayrıştırmak için aşırıya kaçıyor, bu yüzden Oli ve Christoph'un çözümlerini kullanarak kendi işlevimi yaptım . Burada orta Avrupa'da nadiren aything kullanıyoruz, ancak OP formatı, bu yüzden burada kullanılan basit uygulamalar için yeterli olmalı.

function ParseDate(dateString) {
    //dd.mm.yyyy, or dd.mm.yy
    var dateArr = dateString.split(".");
    if (dateArr.length == 1) {
        return null;    //wrong format
    }
    //parse time after the year - separated by space
    var spacePos = dateArr[2].indexOf(" ");
    if(spacePos > 1) {
        var timeString = dateArr[2].substr(spacePos + 1);
        var timeArr = timeString.split(":");
        dateArr[2] = dateArr[2].substr(0, spacePos);
        if (timeArr.length == 2) {
            //minutes only
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]));
        } else {
            //including seconds
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]), parseInt(timeArr[2]))
        }
    } else {
        //gotcha at months - January is at 0, not 1 as one would expect
        return new Date(parseInt(dateArr[2]), parseInt(dateArr[1] - 1), parseInt(dateArr[0]));
    }
}

4

Date.parse() oldukça zekidir ancak formatın doğru ayrıştırılacağını garanti edemem.

Değilse, bu iki köprü arasında bir şey bulmak gerekir. Örneğiniz oldukça basittir (yalnızca sayılardır), bu nedenle string.split()bazılarıyla eşleştirilmiş REGEX (hatta daha hızlı olabilir) dokunuşu parseInt()hızlı bir şekilde tarih oluşturmanıza olanak tanır.


4
time = "2017-01-18T17:02:09.000+05:30"

t = new Date(time)

hr = ("0" + t.getHours()).slice(-2);
min = ("0" + t.getMinutes()).slice(-2);
sec = ("0" + t.getSeconds()).slice(-2);

t.getFullYear()+"-"+t.getMonth()+1+"-"+t.getDate()+" "+hr+":"+min+":"+sec

artı 1 getmonth () işlevini çağırdıktan sonra yanlış görünüyor
Arjunsingh

Date.getMonth () 0 tabanlı değer döndürdüğü için t.getMonth () + 1 doğrudur.
Jussi Palo

3

Sadece 5 sentimi vermek için.

Tarih biçimim gg.aa.yyyy (İngiltere biçimi) ve yukarıdaki örneklerin hiçbiri benim için çalışmıyor. Tüm ayrıştırıcılar mm'yi gün, gg'yi ay olarak görüyordu.

Bu kütüphaneyi buldum: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ ve işe yaradı, çünkü böyle alanların sırasını söyleyebilirsiniz:

>>console.log(new Date(Date.fromString('09.05.2012', {order: 'DMY'})));
Wed May 09 2012 00:00:00 GMT+0300 (EEST)

Umarım birine yardım eder.


Bağlantılar artık ölü!

Peki ... hızlı bir arşiv.org gösterdi: bitbucket.org/mazzarelli/js-date/downloads proje url'si.
Anton Valqk

1

Moment.js bunu ele alacaktır:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;

1
Moment.js harika olsa da, yalnızca yerel Javascript'i kullanmanız gereken çok sayıda kullanım durumu vardır. Benim şu anki kullanım-case CouchDB bir Harita fonksiyonudur
Zach Smith

1

Bunun için moment.js kütüphanesini kullanabilirsiniz. Sadece zamana özel çıktı almak için kullanıyorum, ancak ne tür bir format seçmek istediğinizi seçebilirsiniz.

Referans:

1. moment kütüphanesi: https://momentjs.com/

2. zaman ve tarihe özel fonksiyonlar: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

convertDate(date) {
        var momentDate = moment(date).format('hh : mm A');
        return momentDate;
}

ve bu yöntemi şöyle çağırabilirsiniz:

this.convertDate('2020-05-01T10:31:18.837Z');

Umut ediyorum bu yardım eder. Kodlamanın tadını çıkarın.


0

Date.parse dönüştürme dizesini tam olarak karşılamak için dd-mm- YYYY'yi RFC822'de belirtildiği gibi biçimlendirmek için, yyyy-aa-gg ayrıştırma kullanırsanız hatalar yapabilirsiniz.


FYI, RFC 822'den (sayfa: 25. Yorum için metin uzunluğunu karşılamak üzere kısmen temizlendi): 13 Ağustos 1982 - 25 - RFC # 822 5. TARİH VE SAAT ÖZELLİKLERİ 5.1. SYNTAX tarih-saat = [gün ","] tarih saat; gg mm yy ss: dd: ss zzz gün = "Pzt" / "Sal" / "Çar" / "Per" / "Cum" / "Cts" / "Paz" tarih = 1 * 2DIGIT ay 2DIGIT; gün ay yıl örneğin 20 Haz 82 ay = "Ocak" / "Şubat" / "Mart" / "Nisan" / "Mayıs" / "Haziran" / "Temmuz" / "Ağustos" / "Eylül" / "Ekim" / " Kasım "/" Ara "
Valentin Rusk

0
//Here pdate is the string date time
var date1=GetDate(pdate);
    function GetDate(a){
        var dateString = a.substr(6);
        var currentTime = new Date(parseInt(dateString ));
        var month =("0"+ (currentTime.getMonth() + 1)).slice(-2);
        var day =("0"+ currentTime.getDate()).slice(-2);
        var year = currentTime.getFullYear();
        var date = day + "/" + month + "/" + year;
        return date;
    }

Sorgulayıcı bir biçim dizesi belirtmesini istedi .
Armali

@Armali Dize biçiminde "/ Tarih (1552415400000) /" gibi giriş parametresi
Abhishek Kanrar
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.