Làm cách nào để trừ phút từ một ngày trong javascript?


132

Làm cách nào tôi có thể dịch mã giả này thành js hoạt động [đừng lo lắng về ngày kết thúc đến từ đâu ngoại trừ đó là ngày javascript hợp lệ].

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());

Câu trả lời:


199

Một khi bạn biết điều này:

  • Bạn có thể tạo một Datebằng cách gọi hàm tạo với mili giây kể từ ngày 1 tháng 1 năm 1970.
  • Số valueOf()a Datelà số mili giây kể từ ngày 1 tháng 1 năm 1970
  • Có một 60,000phần nghìn giây trong một phút: -]

... nó không quá khó

Trong mã dưới đây, một cái mới Dateđược tạo ra bằng cách trừ đi số mili giây thích hợp từ myEndDateTime:

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

6
Nhưng không xử lý khi bạn thêm phút. Để xử lý chính xác khi bạn thêm phút, bạn nên sử dụng .getTime(). Ví dụ:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
Gabriel L. Oliveira

Bạn cũng có thể sử dụng var myStartDate = somedate.addMinutes(-durationInMuntes);Tôi giả sử một ngày nào đó là một đối tượng Ngày
kubahaha

1
Nó hoạt động ... nhưng có một câu hỏi rằng hàm tạo Date () có 3 tùy chọn, tức là 1: trống 2: chuỗi và 3: Số năm, Số tháng .... vậy cái nào được sử dụng ở trên theo sau hàm tạo nào?
Zafar


Đối với một ví dụ về cách này có thể đi sai, sử dụng Châu Âu / London như locale múi giờ: var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);bạn mong chờ eđược 02:10:00, phải không? Không. 01:10:00. DST nói xin chào. Và sau đó có những bước nhảy vọt ...
Niet the Dark Tuyệt đối

80

Bạn cũng có thể sử dụng get và thiết lập phút để đạt được nó:

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

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

51
Điều đáng chú ý setMinutes()là đủ thông minh để xử lý các phút tiêu cực một cách chính xác. Vì vậy, nếu ngày bắt đầu là 3:05, và bạn muốn trừ 30 phút, bạn sẽ được thông qua trong -25để setMinutes (), mà là đủ thông minh để biết rằng 3:-252:35. (tức là nó không ném ngoại lệ.)
Kip

2
@Kip - Cảm ơn, đó là cái nhìn sâu sắc làm cho câu trả lời này đáng giá. Nhưng tất cả các trình duyệt có đảm bảo điều này? Tôi hỏi vì MDN nói chỉ cho phép 0 - 59 - nhưng tôi nghi ngờ các tài liệu chỉ sai trong trường hợp này? Xem: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/
mẹo

Điều này hữu ích hơn với tôi, tôi muốn trừ thời gian từ một đối tượng Date hiện có được thiết lập theo một cách cụ thể thông qua hàm tạo. Cảm ơn bạn!
Bill Effin Murray

1
Chỉ cần nhớ rằng .setMinutes(...)lực xử lý intgiá trị. Nếu bạn đặt 1.5 minutesthành một, Datenó sẽ chỉ được đặt 1 minutevà giữ các giây giống như trước.
Gabriel L. Oliveira

Tôi đã nhận được các giá trị sai trong trường hợp sử dụng tương tự khi tôi thử startDate = endDate. Có vẻ như vấn đề xảy ra khi một bản sao nông
raghav710

35

Tất cả mọi thứ chỉ là tích tắc, không cần phải ghi nhớ phương pháp ...

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

hoặc là

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

cập nhật

Sau khi làm việc với khoảnh khắc, tôi phải nói rằng đây là một thư viện tuyệt vời mà bạn nên kiểm tra. Đúng là bọ ve hoạt động trong nhiều trường hợp làm cho mã của bạn rất nhỏ và bạn nên cố gắng làm cho mã của mình càng nhỏ càng tốt cho những gì bạn cần làm. Nhưng đối với bất cứ điều gì phức tạp, sử dụng khoảnh khắc.


2
IMO này không đơn giản. Phải mất một số nỗ lực để giải mã những gì mã này thực sự làm. Cách tiếp cận tốt hơn là bọc loại logic đó trong một hàm.
sszarek

12

Moment.js có một số phương thức tiện lợi thực sự tốt để thao tác với các đối tượng ngày

Các .subtract phương pháp, cho phép bạn trừ đi một số tiền nhất định của các đơn vị thời gian từ một ngày, bằng cách cung cấp số lượng và một chuỗi 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

Đây là những gì tôi tìm thấy:

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

Nguồn:

http://www.javascriptcookbook.com/article/Perform-date-manipulation-basing-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.

bạn có thể chuyển đổi dấu thời gian Unix thành thời gian thông thường bằng cách sử dụng. new Date()Ví dụ:

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

Tôi đã thực hiện một số thay đổi định dạng. Hãy chắc chắn rằng nó vẫn phản ánh những gì bạn dự định đăng.
adiga

1

Hãy thử như dưới đây:

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

0

Đây là những gì tôi đã làm: xem trên 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 không sử dụng new Date(), nhưng có một số ngày được chỉ định và chỉ được hỏi về việc trừ phút. Ngoài ra, mã của bạn không hoạt động - nó trả về dấu thời gian UNIX thay vì đối tượng Date.
Michał Perłakowski

0

Mở rộng lớp ngày với chức năng này

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

Vì vậy, bạn có thể thêm hoặc trừ một số phút, giây, giờ, ngày ... vào bất kỳ ngày nào.

add_10_minutes_to_current_date = Date.dateAdd( Date(), 10, "m");
subs_1_hour_to_a_date = Date.dateAdd( date_value, -1, "h");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.