Gg-aa-yyyy dizesini tarihe dönüştür


185

aşağıdaki kullanarak JavaScript bir tarih nesnesine dd-mm-yyyy biçiminde bir dize dönüştürmek çalışıyorum:

 var from = $("#datepicker").val();
 var to = $("#datepickertwo").val();
 var f = new Date(from);
 var t = new Date(to);

("#datepicker").val()gg-aa-yyyy biçiminde bir tarih içerir. Aşağıdakileri yaptığımda, "Geçersiz Tarih" i alıyorum:

alert(f);

Bu '-' sembolü yüzünden mi? Bunun üstesinden nasıl gelebilirim?


Bu, tüm tarihlerde mi yoksa belirli bir tarihte mi oluyor?
kasdega

Yanıtlar:


326

"-" üzerine böl

İpi ihtiyacınız olan parçalara ayrıştırın:

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Normal ifadeyi kullan

var date = new Date("15-05-2018".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"))

Neden regex kullanılmıyor?

Çünkü, tire ile ayrılmış üç bölümden oluşan bir ip üzerinde çalışacağınızı biliyorsunuz.

Ancak, aynı dizeyi başka bir dizede aradıysanız, normal ifade gitmenin yolu olurdu.

Yeniden

Bunu örnek kodunuzda birden fazla kez yaptığınızdan ve kod tabanınızın başka bir yerinde yaptığınızdan, bir işlevde tamamlayın:

function toDate(dateStr) {
  var parts = dateStr.split("-")
  return new Date(parts[2], parts[1] - 1, parts[0])
}

Olarak kullanma:

var from = $("#datepicker").val()
var to = $("#datepickertwo").val()
var f = toDate(from)
var t = toDate(to)

Veya işlevinizde jQuery sakıncası yoksa:

function toDate(selector) {
  var from = $(selector).val().split("-")
  return new Date(from[2], from[1] - 1, from[0])
}

Olarak kullanma:

var f = toDate("#datepicker")
var t = toDate("#datepickertwo")

Modern JavaScript

Daha modern JS kullanabiliyorsanız, dizi imhası da hoş bir dokunuş:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}

9
beni dövdü ... ama hala DateJ kullanıyorum. Bir çit sonrası hatası nedeniyle bu tam olarak doğru değil. ay 0-11'dir, bu nedenle 1'i çıkarmanız gerekir. f = yeni Tarih ([2] 'den, [1] -1' den [0] 'a kadar);
kasdega

12
Yanlış tarihler üreten bir hata ile seçilen cevap. Müthiş!
epascarello

3
Cheers @kasdega - Düzenledi ... bir süre önce!
Adrian Lynch

@AdrianLynch Nasıl javascript "Ay gg, yyyy" için "gg / gg / yyyy" dönüştürmek için?
dilipkumar1007

1
@Adrian Lynch Modern JavaScript seçeneği harika! Teşekkür ederim.
Alexandre Ribeiro

134

düzenli ifade örneği:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );

8
Ayrıca yapılan bir düzeltme /sınırlayıcı ve 2 basamaktan (veya 1'den büyük herhangi bir sayıdan) oluşan bir yıldır:replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki

1
Neden bu @AdemirNuno cevabı seçilmeli? RegEx'i bilinen bir biçimde bir dize için neden kullanmalıyım? Bir desen aramıyorsunuz, ilk sayının gün, ikincisi ay ve üçüncü yılın olduğunu biliyorsunuz. Bu durumda RegEx iş için yanlış araçtır.
Adrian Lynch

Sayı olmayan sınırlayıcılar, new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") );
baştaki

çok pratik adamım, teşekkürler. tarih formatım zamanla geliyor, bu yüzden şu şekilde yeniden kodladım: 'new Date ("13-01-2011" .replace (/ (\ d {2}) - (\ d {2}) - (\ w) / , "2 $ / 1 $ / 3 $")); ' doğru mu?
Kamuran Sönecek

@NeerajSingh Javascript "Ay gg, yyyy" dönüştürmek nasıl "MM / gg / yyyy"?
dilipkumar1007

15

Bir başka olasılık:

var from = "10-11-2011"; 
var numbers = from.match(/\d+/g); 
var date = new Date(numbers[2], numbers[0]-1, numbers[1]);

Rakamları eşleştirin ve yeniden sıralayın


Ayrıca orijinal soru "mm-gg-yyyy" değil, "gg-aa-yyyy" belirtildi, bu yüzden hala yanlış (ama sadece).
Phil M Jones

@epascarello Nasıl javascript "Ay gg, yyyy" dönüştürmek için "aa / gg / yyyy" dönüştürmek?
dilipkumar1007

1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes

7

Moment.js örneğini kullanma :

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)

1
moment (itibaren, "GG-AA-YYYY") .Tarih ()
Lapenkov Vladimir

6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);

3
Date.parseDate aldınız mı?
kasdega

@kasdega Üzgünüm, $ .datepicker.parseDate'i düşünüyordum, şimdi düzelttim :)
Saad Imran.

Api.jqueryui.com/datepicker adresindeki chek datepicker belgeleri $.datepicker.parseDate("dd-mm-yy", from);gibi bir tarihi düzgün bir şekilde ayrıştırmak için kullanmalısınız24-01-2017
Andrea Mauro

4

Ayrıca Date()nesnenin parantezlerinin içine şu şekilde bir tarih yazabilirsiniz :

new Date("Month dd, yyyy hh:mm:ss")
new Date("Month dd, yyyy")
new Date(yyyy,mm,dd,hh,mm,ss)
new Date(yyyy,mm,dd)
new Date(milliseconds)

@AmitSengar Nasıl javascript "Ay gg, yyyy" dönüştürmek için "AA / gg / yyyy" dönüştürmek?
dilipkumar1007

3

Bu biçimi kullanın: myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00


1
Bu parseDateişlevi nereden aldın ? Bu bir yerel javascript işlevi mi?
Joseph Silber

üzgünüm bunu nasıl uygularım? Ayrıca dd-mm-yy biçimine ihtiyacım var
user559142

parseDate yerel bir JS işlevidir. Daha fazla bilgi için: xaprb.com/articles/javascript-date-parsing-demo.html
Diodeus - James MacFarlane

1
@Diodeus ... gerçekten yerli mi? nasıl ff ve krom atma hataları geliyor?
epascarello

3
@Diodeus son düzenleme ile bile bu benim için pek işe yaramaz (en azından Chrome ile). Tarihi '2011-01-03've UTC saatini ayarlar 00:00:00. Dolayısıyla, kullanıcının saat dilimi UTC'den küçükse, aslında bir gün önce olur.
Mike

3

Benim durumumda

new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6"))

Sonuç: Pzt 02 Kasım 2015 04:40:13 GMT + 0100 (CET) sonra milisaniye ile çalışmak için .getTime () kullanın


3

Kabul edilen cevapta bir hata var

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Tarih seçici "77-78-7980" içeriyorsa bu geçerli bir tarih değildir. Bunun sonucu:

var f = new Date(7980, 77, 77);
=> Date 7986-08-15T22:00:00.000Z

Hangi muhtemelen istenen sonuç değildir.

Bunun nedeni MDN sitesinde açıklanmaktadır :

Tarih, birden fazla bağımsız değişkeni olan bir kurucu olarak çağrıldığında, değerler mantıksal aralıklarından büyükse (örn. Ay değeri olarak 13 veya dakika değeri için 70 sağlanır), bitişik değer ayarlanır. Örneğin new Date(2013, 13, 1), eşdeğerdir new Date(2014, 1, 1).


Sorunu çözmenin daha iyi bir yolu:

const stringToDate = function(dateString) {
  const [dd, mm, yyyy] = dateString.split("-");
  return new Date(`${yyyy}-${mm}-${dd}`);
};

console.log(stringToDate('04-04-2019'));
// Date 2019-04-04T00:00:00.000Z

console.log(stringToDate('77-78-7980'));
// Invalid Date

Bu size geçersiz girişi işleme imkanı verir.

Örneğin:

const date = stringToDate("77-78-7980");

if (date === "Invalid Date" || isNaN(date)) {
  console.log("It's all gone bad");
} else {
  // Do something with your valid date here
}


1

Küçük tarihlerle ilgili tüm sorunlar için Datejs'e bir göz atın .. Bunu parseDate işleviyle de çözebilirsiniz


0

Bir Regexp kullanabilirsiniz.

var result = /^(\d{2})-(\d{2})-(\d{4})$/.exec($("#datepicker").val());
if (result) {
    from = new Date(
        parseInt(result[3], 10), 
        parseInt(result[2], 10) - 1, 
        parseInt(result[1], 10)
    );
}

Yanlış ay üretir! Aylar sıfırdan başlar, bir değil. Yani Jan yaptıysanız, sizinki Şubat diyecektir.
epascarello

1
@epascarello - Tarih API'sinin ne kadar topal olduğunu unutma.
ChaosPandion

@ChaosPandion: Javascript'te myDate = '20 / 06/17 'biçimini '20 / 6/2017 00:00:00' biçimine nasıl dönüştürebilirim?
Ghanshyam Lakhani

-1
new Date().toLocaleDateString();

bu kadar basit, sadece tarihinizi js Date Object'e iletin


Tarih dizgisini Tarih yapıcısının içine, new Date('30/12/2018').toLocaleDateString()?? Bu Geçersiz Tarih
Ms.Tamil
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.