ฉันจะลบนาทีจากวันที่ในจาวาสคริปต์ได้อย่างไร


143

ฉันจะแปลรหัสหลอกนี้เป็น 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());

คำตอบ:


210

เมื่อคุณรู้สิ่งนี้แล้ว:

  • คุณสามารถสร้างDateโดยเรียกตัวสร้างด้วยมิลลิวินาทีตั้งแต่วันที่ 1 มกราคม 1970
  • เป็นจำนวนมิลลิวินาทีตั้งแต่ 1 มกราคม 1970valueOf()Date
  • มี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);ฉันถือว่าวันหนึ่งเป็นวัตถุวันที่
kubahaha

1
มันใช้งานได้ ... แต่มีคำถามว่าตัวสร้าง Date () มี 3 ตัวเลือกคือ 1: empty 2: string และ 3: Number year, Number Month .... ดังนั้นตัวที่ถูกใช้ข้างต้นจะตามด้วยตัวสร้างตัวไหน
Zafar


ตัวอย่างของวิธีที่อาจผิดพลาดโดยใช้ Europe / London เป็นเขตเวลา: 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 the Dark Absolute

85

คุณยังสามารถใช้รับและตั้งค่านาทีเพื่อให้บรรลุ:

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

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

56
เป็นที่น่าสังเกตว่าsetMinutes()ฉลาดพอที่จะจัดการนาทีเชิงลบได้อย่างถูกต้อง ดังนั้นหากวันที่เริ่มต้นเป็น 03:05 และคุณต้องการที่จะลบ 30 นาทีคุณต้องการจะผ่านใน-25การ setMinutes () ซึ่งจะฉลาดพอที่จะรู้ว่าเป็น3:-25 2:35(กล่าวคือไม่ได้มีข้อยกเว้น)
กีบ

2
@Kip - ขอบคุณข้อมูลเชิงลึกที่ทำให้คำตอบนี้คุ้มค่า แต่ทุกเบราว์เซอร์รับประกันสิ่งนี้หรือไม่? ฉันถามเพราะ MDN บอกว่าอนุญาตเพียง 0 - 59 เท่านั้น - แต่ฉันสงสัยว่าเอกสารจะผิดในกรณีนี้? ดู: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Justin Ethier

สิ่งนี้มีประโยชน์มากขึ้นสำหรับฉันฉันต้องการลบเวลาออกจากอินสแตนซ์วัตถุวันที่ที่มีอยู่ซึ่งตั้งค่าในลักษณะเฉพาะผ่านตัวสร้าง ขอบคุณ!
Bill Effin Murray

1
เพียงจำไว้ว่า.setMinutes(...)แรงจัดการกับintค่า หากคุณตั้งค่า1.5 minutesเป็นDateมันจะตั้งค่า1 minuteและคงวินาทีไว้เหมือนเดิม
Gabriel L. Oliveira

ฉันได้รับค่าที่ไม่ถูกต้องในกรณีการใช้งานที่คล้ายกันเมื่อฉันลอง startDate = endDate ดูเหมือนปัญหาที่สำเนาตื้นเกิดขึ้น
raghav710

39

ทุกอย่างเป็นเพียงเห็บไม่ต้องท่องจำวิธี ...

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

หรือ

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

อัพเดต

หลังจากทำงานกับ momentjs ฉันต้องบอกว่านี่เป็นห้องสมุดที่น่าทึ่งที่คุณควรลองดู เป็นเรื่องจริงที่การทำเครื่องหมายในหลาย ๆ กรณีทำให้โค้ดของคุณมีขนาดเล็กมากและคุณควรพยายามทำให้โค้ดของคุณมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้สำหรับสิ่งที่คุณต้องทำ แต่สำหรับสิ่งที่ซับซ้อนให้ใช้ momentjs


2
IMO นี่ไม่ใช่เรื่องง่าย ต้องใช้ความพยายามพอสมควรในการถอดรหัสว่ารหัสนี้ใช้ทำอะไรได้บ้าง แนวทางที่ดีกว่าคือการรวมตรรกะแบบนั้นไว้ในฟังก์ชัน
sszarek

13

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 ...

7

นี่คือสิ่งที่ฉันพบ:

//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


6
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.

คุณสามารถแปลงเวลา Unix ลงในเวลาเดิมโดยใช้new Date()การกีฬายกตัวอย่างเช่น

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

ฉันได้ทำการเปลี่ยนแปลงการจัดรูปแบบบางอย่าง โปรดตรวจสอบให้แน่ใจว่ายังคงแสดงถึงสิ่งที่คุณตั้งใจจะโพสต์
adiga

สิ่งนี้อาจทำงานได้ไม่ดีเมื่อใกล้การเปลี่ยนโซนเวลาควรใช้ getUTCMinutes + setUTCMinutes ดีกว่า
Viktor Mukhachev


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()แต่มีวันที่ระบุไว้และถามเฉพาะเกี่ยวกับการลบนาที นอกจากนี้รหัสของคุณไม่ทำงาน - จะส่งคืนการประทับเวลา 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.