자바 스크립트에서 날짜에서 분을 빼려면 어떻게합니까?


133

이 의사 코드를 작동하는 js로 어떻게 변환 할 수 있습니까? [유효한 자바 스크립트 날짜를 제외하고 종료 날짜가 어디에서 오는지 걱정하지 마십시오].

var myEndDateTime = somedate;  //somedate is a valid js date  
var durationInMinutes = 100; //this can be any number of minutes from 1-7200 (5 days)

//this is the calculation I don't know how to do
var myStartDate = somedate - durationInMuntes;

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());

답변:


199

이 사실을 알게되면 :

  • 1970 년 1 월 1 일 이후 밀리 초로 생성자Date호출하여을 만들 수 있습니다 .
  • valueOf()a는 Date1970년 1월 1일 이후의 밀리 초 수입니다
  • 60,000분에 밀리 초가 있습니다 :-]

... 그다지 어렵지 않습니다.

아래 코드에서 다음 Date에서 적절한 밀리 초를 빼서 새로운 것이 생성됩니다 myEndDateTime.

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);

6
그러나 분을 추가 할 때는 처리하지 않습니다. 분을 추가 할 때 올바르게 처리하려면을 사용해야합니다 .getTime(). 예 :var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
Gabriel L. Oliveira

var myStartDate = somedate.addMinutes(-durationInMuntes);나는 somedate가 Date 객체라고 가정 할 수있다
kubahaha

1
작동하지만 Date () 생성자에는 3 개의 옵션, 즉 1 : empty 2 : string 및 3 : Number year, Number Month ...가 있습니다. 위에서 사용되는 것이 어떤 생성자를 따르는가?
Zafar


방법의 예를 들어이 시간대 로케일로 유럽 / 런던을 사용하여 잘못 될 수 있습니다 : var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);당신이 기대하는 e것으로 02:10:00, 맞죠? 아니. 01:10:00. DST가 말합니다. 그리고 윤초가 있습니다 ...
어두운 절대를 Niet

81

get 및 set 분을 사용하여 달성 할 수도 있습니다.

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);

52
setMinutes()음수 분을 올바르게 처리 할 수있을만큼 똑똑하다는 점 은 주목할 가치가 있습니다. 이 경우 시작 날짜 3:05, 그리고 당신은 당신이 전달 될 것입니다, 30 분 차감 할 -25것을 알고 스마트 충분하다 setMinutes ()에 3:-25있습니다 2:35. (예, 예외는 발생하지 않습니다.)
Kip

2
@Kip-감사합니다. 이것이 바로이 답변을 가치있게 만드는 통찰력입니다. 그러나 모든 브라우저가 이것을 보장합니까? MDN에 0-59 만 허용되기 때문에 묻습니다. 그러나이 경우 문서가 잘못되었다고 생각합니까? 참조 : developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Justin Ethier

이것은 나에게 더 유용했습니다. 생성자를 통해 특정 방식으로 설정된 기존 Date 객체 인스턴스에서 시간을 빼고 싶었습니다. 감사합니다!
Bill Effin Murray

1
.setMinutes(...)힘 핸들 int값을 기억하십시오 . 를 설정하면 1.5 minutes으로 Date만 설정합니다 1 minute및 초를 이전과 동일하게 유지.
Gabriel L. Oliveira

startDate = endDate를 시도했을 때 비슷한 유스 케이스에서 잘못된 값을 얻었습니다. 얕은 복사가 발생하는 문제처럼 보입니다
raghav710

35

모든 것이 진드기 일 뿐이며 방법을 암기 할 필요가 없습니다 ...

var aMinuteAgo = new Date( Date.now() - 1000 * 60 );

또는

var aMinuteLess = new Date( someDate.getTime() - 1000 * 60 );

최신 정보

momentjs로 작업 한 후에는 이것이 체크 아웃 해야하는 놀라운 라이브러리라고 말해야합니다. 많은 경우에 진드기가 작동하여 코드를 매우 작게 만드는 것이 사실이므로 가능한 한 작게 코드를 작게 만들어야합니다. 그러나 복잡한 작업에는 momentjs를 사용하십시오.


2
IMO는 그렇게 간단하지 않습니다. 이 코드가 실제로하는 일을 해독하려면 약간의 노력이 필요합니다. 더 나은 방법은 이러한 종류의 논리를 함수로 감싸는 것입니다.
sszarek

12

moment.js 에는 날짜 객체를 조작하는 편리한 방법이 있습니다.

.subtract 방법은, 당신은 금액과 TIMEUNIT 문자열을 제공하여 날짜에서 시간 단위의 일정 금액을 차감 할 수 있습니다.

var now = new Date();
// Sun Jan 22 2017 17:12:18 GMT+0200 ...
var olderDate = moment(now).subtract(3, 'minutes').toDate();
// Sun Jan 22 2017 17:09:18 GMT+0200 ...

6

이것이 내가 찾은 것입니다.

//First, start with a particular time
var date = new Date();

//Add two hours
var dd = date.setHours(date.getHours() + 2);

//Go back 3 days
var dd = date.setDate(date.getDate() - 3);

//One minute ago...
var dd = date.setMinutes(date.getMinutes() - 1);

//Display the date:
var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var date = new Date(dd);
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
var displayDate = monthNames[monthIndex] + ' ' + day + ', ' + year;
alert('Date is now: ' + displayDate);

출처 :

http://www.javascriptcookbook.com/article/Perform-date-manipulations-based-on-adding-or-subtracting-time/

https://stackoverflow.com/a/12798270/1873386


5
var date=new Date();

//here I am using "-30" to subtract 30 minutes from the current time.
var minute=date.setMinutes(date.getMinutes()-30); 

console.log(minute) //it will print the time and date according to the above condition in Unix-timestamp format.

new Date()예를 들어 Unix 타임 스탬프를 표준 시간으로 변환 할 수 있습니다.

var extract=new Date(minute)
console.log(minute)//this will print the time in the readable format.

서식을 일부 변경했습니다. 게시하려는 내용이 여전히 반영되어 있는지 확인하십시오.
adiga

1

아래와 같이 시도하십시오 :

var dt = new Date();
dt.setMinutes( dt.getMinutes() - 20 );
console.log('#####',dt);

0

이것이 내가 한 일입니다 : Codepen에서 참조하십시오

var somedate = 1473888180593;
var myStartDate;
//var myStartDate = somedate - durationInMuntes;

myStartDate = new Date(dateAfterSubtracted('minutes', 100));

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());

function dateAfterSubtracted(range, amount){
    var now = new Date();
    if(range === 'years'){
        return now.setDate(now.getYear() - amount);
    }
    if(range === 'months'){
        return now.setDate(now.getMonth() - amount);
    }
    if(range === 'days'){
        return now.setDate(now.getDate() - amount);
    }
    if(range === 'hours'){
        return now.setDate(now.getHours() - amount);
    }
    if(range === 'minutes'){
        return now.setDate(now.getMinutes() - amount);
    }
    else {
        return null;
    }
}

OP는을 사용하지 않지만 new Date()특정 날짜가 있으며 분 빼기에 대해서만 물었습니다. 또한 코드가 작동하지 않습니다. Date 객체 대신 UNIX 타임 스탬프가 반환됩니다.
Michał Perłakowski

0

이 함수로 날짜 클래스 확장

// Add (or substract if value is negative) the value, expresed in timeUnit
// to the date and return the new date.
Date.dateAdd = function(currentDate, value, timeUnit) {

    timeUnit = timeUnit.toLowerCase();
    var multiplyBy = { w:604800000,
                     d:86400000,
                     h:3600000,
                     m:60000,
                     s:1000 };
    var updatedDate = new Date(currentDate.getTime() + multiplyBy[timeUnit] * value);

    return updatedDate;
};

따라서 모든 날짜에 분, 초, 시간, 일 ...을 더하거나 뺄 수 있습니다.

add_10_minutes_to_current_date = Date.dateAdd( Date(), 10, "m");
subs_1_hour_to_a_date = Date.dateAdd( date_value, -1, "h");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.