programing

날짜 개체에 시간을 추가하는 방법

copysource 2022. 9. 18. 16:14
반응형

날짜 개체에 시간을 추가하는 방법

JavaScript의 Date 객체가 어떤 종류의 add 함수를 구현하지 않는 것이 놀랍습니다.

이 기능을 사용할 수 있는 기능을 원합니다.

var now = Date.now();
var fourHoursLater = now.addHours(4);

function Date.prototype.addHours(h) {

   // How do I implement this?

}

나는 단지 방향성에 대한 몇 가지 조언이 필요하다.

  • 문자열 해석을 해야 하나요?

  • set Time을 사용할 수 있습니까?

  • 밀리초면 어때?

다음과 같이 합니다.

new Date(milliseconds + 4*3600*1000 /* 4 hours in ms */)?

하지만 이것은 정말 해킹적으로 보인다 - 그리고 효과가 있기는 할까?

JavaScript 자체에는 끔찍한 날짜/시간 API가 있습니다.단, 순수 JavaScript로 이 작업을 수행할 수 있습니다.

Date.prototype.addHours = function(h) {
  this.setTime(this.getTime() + (h*60*60*1000));
  return this;
}
Date.prototype.addHours= function(h){
    this.setHours(this.getHours()+h);
    return this;
}

테스트:

alert(new Date().addHours(4));

다음 코드는 날짜에 4시간을 추가합니다(예: 오늘 날짜).

var today = new Date();
today.setHours(today.getHours() + 4);

4 ~ 23 을 추가하려고 해도 에러는 발생하지 않습니다(매뉴얼 참조).

지정한 파라미터가 예상 범위를 벗어나면 setHours()는 이에 따라 Date 객체의 날짜 정보를 갱신하려고 합니다.

날짜 객체의 매개 변수를 변환하는 대신 해당 날짜 객체의 복사본을 반환하여 addHours 메서드를 변경하지 않는 것이 좋습니다.

Date.prototype.addHours= function(h){
    var copiedDate = new Date(this.getTime());
    copiedDate.setHours(copiedDate.getHours()+h);
    return copiedDate;
}

이렇게 하면 상태를 걱정하지 않고 많은 메서드 호출을 연결할 수 있습니다.

설정된 시간 번호이기 때문에 DST로 또는 DST에서 변경할 때 kennebec이 제안하는 버전은 실패합니다.

this.setUTCHours(this.getUTCHours()+h);

추가하다h까지 몇 시간this시간 시스템의 특이성과는 무관합니다.

Jason Harwig의 방법도 효과가 있습니다.

지금부터 정확히 두 시간 후에 한 줄로 데이트를 잡아라.

새 날짜로 밀리초를 전달해야 합니다.

let expiryDate = new Date(new Date().setHours(new Date().getHours() + 2));

        or

let expiryDate2 = new Date(Date.now() + 2 * (60 * 60 * 1000) );

let nowDate = new Date();
let expiryDate = new Date(new Date().setHours(new Date().getHours() + 2));
let expiryDate2 = new Date(Date.now() + 2 * (60 * 60 * 1000) );

console.log('now', nowDate);
console.log('expiry', expiryDate);
console.log('expiry 2', expiryDate2);

Moment.js 라이브러리를 사용할 수 있습니다.

var moment = require('moment');
foo = new moment(something).add(10, 'm').toDate();

저도 원래 오브젝트는 수정하면 안 된다고 생각합니다.Jason Harwig와 Tahir Hasan의 답변을 바탕으로 한 통합 솔루션을 소개합니다.

Date.prototype.addHours= function(h){
    var copiedDate = new Date();
    copiedDate.setTime(this.getTime() + (h*60*60*1000)); 
    return copiedDate;
}

좀 더 기능적인 방법(불변성)을 원하신다면 기존 날짜 오브젝트를 수정하는 대신 새로운 날짜 오브젝트를 반환하고 프로토타입은 변경하지 않고 스탠드아론 함수를 만듭니다.다음은 예를 제시하겠습니다.

//JS
function addHoursToDate(date, hours) {
  return new Date(new Date(date).setHours(date.getHours() + hours));
}

//TS
function addHoursToDate(date: Date, hours: number): Date {
  return new Date(new Date(date).setHours(date.getHours() + hours));
}

let myDate = new Date();

console.log(myDate)
console.log(addHoursToDate(myDate,2))

Datejs 라이브러리에 추가가 있습니다.

다음은 JavaScript 날짜 메서드입니다.kennebec은 get Hours()와 set Hours()를 현명하게 언급했다.

아직 정의되어 있지 않은지 확인합니다.그렇지 않으면 날짜 프로토타입에서 정의합니다.

if (!Date.prototype.addHours) {
    Date.prototype.addHours = function(h) {
        this.setHours(this.getHours() + h);
        return this;
    };
}

이 문제를 해결하는 또 다른 방법은 날짜를 고유 시간(에포치)으로 변환한 다음 동등한 값을 (밀리)초 단위로 추가한 후 다시 변환하는 것입니다.이렇게 하면 21에 4시간을 더하면 다음날 01:00가 되는 등 일별 및 월별 전환을 처리할 수 있습니다.

이렇게 하면 증가 또는 감소된 데이터 값을 쉽게 얻을 수 있습니다.

const date = new Date()
const inc = 1000 * 60 * 60 // an hour
const dec = (1000 * 60 * 60) * -1 // an hour

const _date = new Date(date)
return new Date(_date.getTime() + inc)
return new Date(_date.getTime() + dec)

JavaScript의 간단한 추가/감산 시간/분 함수는 다음과 같습니다.

function getTime (addHour, addMin){
    addHour = (addHour ? addHour : 0);
    addMin = (addMin ? addMin : 0);
    var time = new Date(new Date().getTime());
    var AM = true;
    var ndble = 0;
    var hours, newHour, overHour, newMin, overMin;

    // Change form 24 to 12 hour clock
    if(time.getHours() >= 13){
        hours = time.getHours() - 12;
        AM = (hours>=12 ? true : false);
    }else{
        hours = time.getHours();
        AM = (hours>=12 ? false : true);
    }

    // Get the current minutes
    var minutes = time.getMinutes();

    // Set minute
    if((minutes + addMin) >= 60 || (minutes + addMin) < 0){
        overMin = (minutes + addMin) % 60;
        overHour = Math.floor((minutes + addMin - Math.abs(overMin))/60);
        if(overMin < 0){
            overMin = overMin + 60;
            overHour = overHour-Math.floor(overMin/60);
        }
        newMin = String((overMin<10 ? '0' : '') + overMin);
        addHour = addHour + overHour;
    }else{
        newMin = minutes + addMin;
        newMin = String((newMin<10 ? '0' : '') + newMin);
    }
    // Set hour
    if((hours + addHour >= 13) || (hours + addHour <= 0)){
        overHour = (hours + addHour) % 12;
        ndble = Math.floor(Math.abs((hours + addHour)/12));
        if(overHour <= 0){
            newHour = overHour + 12;
            if(overHour == 0){
                ndble++;
            }
        }else{
            if(overHour == 0){
                newHour = 12;
                ndble++;
            }else{
                ndble++;
                newHour = overHour;
            }
        }
        newHour = (newHour<10 ? '0' : '') + String(newHour);
        AM = ((ndble + 1) % 2 === 0) ? AM : !AM;
    }else{
        AM = (hours + addHour == 12 ? !AM : AM);
        newHour = String((Number(hours) + addHour < 10 ? '0': '') + (hours + addHour));
    }
    var am = (AM) ? 'AM' : 'PM';
    return new Array(newHour, newMin, am);
};

파라미터 없이 현재 시간을 취득할 수 있습니다.

getTime();

또는 파라미터를 사용하여 분/시간을 추가할 수 있습니다.

getTime(1, 30); // Adds 1.5 hours to current time
getTime(2);    // Adds 2 hours to current time
getTime(0, 120); // Same as above

마이너스 시간에도 효과가 있습니다.

getTime(-1, -30); // Subtracts 1.5 hours from current time

이 함수는 다음 배열을 반환합니다.

array([Hour], [Minute], [Meridian])

SPRBRN이 맞다.월과 연도의 시작/끝을 고려하려면 Epoch 및 back으로 변환해야 합니다.

그 방법은 다음과 같습니다.

var milliseconds = 0;          //amount of time from current date/time
var sec = 0;                   //(+): future
var min = 0;                   //(-): past
var hours = 2;
var days = 0;

var startDate = new Date();     //start date in local time (we'll use current time as an example)

var time = startDate.getTime(); //convert to milliseconds since epoch

//add time difference
var newTime = time + milliseconds + (1000*sec) + (1000*60*min) + (1000*60*60*hrs) + (1000*60*60*24*days);

var newDate = new Date(newTime); //convert back to date; in this example: 2 hours from right now

또는 한 줄로 수행합니다(변수 이름은 위와 같습니다).

var newDate =
    new Date(startDate.getTime() + millisecond +
        1000 * (sec + 60 * (min + 60 * (hours + 24 * days))));

이거면 될 것 같아

 var nextHour  = Date.now() + 1000 * 60 * 60;

문자열로 필요한 경우, 예를 들어 다음과 같습니다.

var defaultTime: new Date().getHours() + 1 + ":" + new Date().getMinutes();

좀 지저분하긴 하지만 효과가 있어!

다음과 같은 날짜 형식을 지정: 2019-04-03T15:58

  //Get the start date.
  var start = $("#start_date").val();
  //Split the date and time.
  var startarray = start.split("T");
  var date = startarray[0];
  var time = startarray[1];

  //Split the hours and minutes.
  var timearray = time.split(":");

  var hour = timearray[0];
  var minute = timearray[1];
  //Add an hour to the hour.
  hour++;
  //$("#end_date").val = start;
  $("#end_date").val(""+date+"T"+hour+":"+minute+"");

출력: 2019-04-03T16:58

가장 쉬운 방법은 다음과 같습니다.

var d = new Date();
d = new Date(d.setHours(d.getHours() + 2));

현재 시간에 2시간이 추가됩니다.

d = 2021년 1월 30일 토요일 23:41:43 GMT+0500(파키스탄 표준시).

2시간 추가 후 d = 2021년 1월 31일 일요일 01:41:43 GMT+0500(파키스탄 표준시).

언급URL : https://stackoverflow.com/questions/1050720/how-to-add-hours-to-a-date-object

반응형