2014-10-31 2 views
1

Получение некоторых несогласованных результатов в javascript при преобразовании дат в строки и строки в даты. Этот код, как отмечается в комментариях, кажется странным:Дата преобразования головоломка

// Start with a string literal   
var s1 = "10/31/2014"; 

// Convert string to date 
var f1 = s1.split("/"); 
var d1 = new Date(f1[2], (f1[0] - 1), f1[1]); 
alert("Date from string: " + d1); // works 

// Convert that date to a string 
a1 = (d1.toLocaleString("en-US")).split(" ", 1); 
alert("Array[0] from split: " + a1[0]); // works 
s2 = a1[0]; 
alert("String from Array[0] assignment: " + s2); 

// Convert string to date (identical to before) 
var f2 = s2.split("/"); 
var d2 = new Date(f2[2], (f2[0] - 1), f2[1]); 
alert("Date from String: " + d2); // fails: "Invalid date" 

Кто-нибудь знает, почему эта строка не является строкой?

Btw, изменение

s2 = a1[0]; 

в

s2 = a1[0].toString(); 

довольно предсказуемо, ничего не меняет. Идеи?

http://jsfiddle.net/pfvh6fed/1/

ответ

0

У вас есть запятая в конце вашего года строки, добавив .replace(',','') исправили проблему

// Start with a string literal   
var s1 = "10/31/2014"; 

// Convert string to date 
var f1 = s1.split("/"); 
var d1 = new Date(f1[2], (f1[0] - 1), f1[1]); 
alert("Date from string: " + d1); // works 

// Convert that date to a string 
a1 = (d1.toLocaleString("en-US")).split(" ", 1); 
alert("Array[0] from split: " + a1[0]); // works 
s2 = a1[0]; 
alert("String from Array[0] assignment: " + s2); 

// Convert string to date (identical to before) 
var f2 = s2.split("/"); 
var d2 = new Date(f2[2].replace(",",""), (f2[0] - 1), f2[1]); 
alert("Date from String: " + d2); // ? 
+0

Я запускаю это в Chrome, и вы на 100% правильны. Chrome возвращает запятую после 2014 года, а IE - нет. Как ни странно, это не ошибка. Попробуйте в IE, и у него нет запятой, и это STILL не работает. Возможно, мне не хватает чего-то очевидного, но я думаю, что он должен работать без запятой, как в IE. – Samene

+0

Хорошо, после большой отладки я решил, что в IE есть одна ошибка. Когда вы создаете строку данных, по какой-либо причине, каждую сторону каждого числа в дате, как указано здесь. '* 14 */* 08 */* 2014 *' есть фантомный символ символьного кода '8206'. Этот символ закручивает функцию parseInt() IE, которая является частью преобразования строки в дату. Вы даете ему строку, она пытается сделать int, но не получается из-за этих двух символов. Это может быть исправлено с заменой регулярного выражения, но гораздо лучше пойти с ответом @ Jofre. – MarshallOfSound

+0

Это можно проверить, предупредив длину строки даты 'a1 [0]', вы увидите, что она на 6 символов длиннее видимой. Это из-за этих 6 «фантонных» символов, которые IE ставит там по какой-то глупой причине. – MarshallOfSound

1

Если печать console.log(f2[2]); вы заметите, что вы на самом деле захват 2014,, с включенной запятой. Удалите это, и он должен работать правильно.

EDIT: лучший способ сделать то, что вы пытаетесь, однако, должны быть семантический способ:

day = date.getDay() 

month = date.getMonth() 

year = date.getFullYear() 
+0

Я думаю, что этот материал браузера делает довольно понятным, что вы правы, что семантический путь является единственным надежным способом. Тем не менее, я хотел бы знать, что не так с моим кодом при запуске в IE (где в LocaleString нет запятой). – Samene

Смежные вопросы