2016-06-09 2 views
1

무엇이 원인인지를 알 수없는 이상한 기능입니다. 드롭 다운에서 사용자가 선택할 수있는 일수가 있습니다. 요일 : [3, 7, 14, 21, 28, 30, 60, 90, 180, 365]왜 특정 날짜에 대해서만 잘못된 Date가 생성되는 moment.js입니까?

따라서 사용자가 3을 선택하면 moment.js가 적절한 ISO 날짜로 변환됩니다. 그러나 사용자가 7, 14 또는 21을 선택하면 "잘못된 날짜"가 생성되지만 다른 모든 경우에는 작동합니다. 무슨 일이야?

vm.getSelectedDate = function (days) { 
      console.log(days); 
      if (vm.selectedReminderDay) { 

       vm.selectedReminderDate = new Date(vm.today); 
       console.log(vm.selectedReminderDate); 

       vm.selectedReminderDate.setDate(vm.today.getDate() + days); 
       console.log(vm.selectedReminderDate); 

       var m = moment(vm.selectedReminderDate, "MM/DD/YYYY h:mm:ss A"); 
       console.log(m); 
       vm.utcReminderDate = m.toISOString(); 
       console.log(vm.utcReminderDate); 
       return "in " + vm.selectedReminderDay + " days"; 
      } 
      else { 
       return "When?" 
      } 
     } 
+3

당신은 어디에서나 순간을 사용하고있는 것처럼 보이지 않지만, 만약 당신이 있었다면, 당신은'getDate + x' (끊기) 대신에'addDays'를 할 수 있습니다. – ssube

답변

2

Date.getDate()이 범위를 벗어나면 예기치 beahvior의 원인이됩니다 달의 현재 날짜를 가져옵니다 (일반적으로는 이상 ~ 30가 될 때). 당신이 사용할 수있는 것은 Date.getTime()입니다 :

vm.selectedReminderDate.setTime(vm.today.getTime() + (days*24*60*60*1000)); 

곱셈 밀리 초 setTime 예상하는로 일을 변환하는 것입니다.


그러나과 같이 혼자 momentjs를 사용하여 날짜를 조작하는 것이 할 수있는 더 좋은 방법 : momentjs를보다 효율적으로 사용하기위한

vm.getSelectedDate = function (days) { 
    if (vm.selectedReminderDay) { 
     var newdate = moment(vm.today).add(days, 'days'); 
     vm.utcReminderDate = newdate.toISOString(); 
     return "in " + vm.selectedReminderDay + " days"; 
    } 
    else return "When?"; 
} 
0

제안들은 다른 답변에서 유효합니다.

왜 7, 14 및 21이 파싱에 사용하려고 시도하는 형식이 맞지 않는 유일한 이유 인 실제 이유가 있습니다. Moment는 Date 객체를 파싱하기위한 문자열로 바꾸고 "MM"부분은 변환 된 문자열의 일 부분과 일치시킵니다. 따라서 한 달의 날짜가 1-12 범위에없는 모든 날짜는 작동하지 않습니다. 다른 날에 같은 코드를 실행하면 다른 마법 번호를 찾을 수 있습니다.

MM이 날짜 부분과 일치하는 방식을 추적하지 못하고 내 지역보다 다를 수 있습니다. 그러나 그것이 요점이라고 생각합니다.

+1

Date 객체를 전달하면 Moment는 구문 분석 할 형식 문자열. 그것은 단지 불필요한 것입니다. [소스 코드] (https://github.com/moment/moment/blob/develop/src/lib/create/from-anything.js#L66)를 참조하십시오. –

+0

나는 그것을 믿지 않고 더 많은 코드를 살펴 보았습니다. 깊이. 실제로 여기에 있습니다 : https://github.com/moment/moment/blob/2.10.6/moment.js#L1335 isDate 검사가 이루어지기 전에 입력이 고려되어 입력이 문자열로 변환됩니다 링크 된 기능에 도달하기 전에 (참고 : 그게 내가 설치 한 조금 오래된 버전에 대한 그 이후로 변경된 경우 보지 않았다) – DonSteep

+0

나는 왜 대답이 downvoted과 잘못된 정보를 위의 upvoted .. 궁금해? – DonSteep

관련 문제