Cách thêm phút vào Ngày của tôi


110

Tôi có đối tượng ngày tháng này:

SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");
Date d1 = df.parse(interviewList.get(37).getTime());

giá trị của d1 là Fri Jan 07 17:40:00 PKT 2011

Bây giờ tôi đang cố gắng thêm 10 phút vào ngày ở trên.

Calendar cal = Calendar.getInstance();
cal.setTime(d1);
cal.add(Calendar.MINUTE, 10);
String newTime = df.format(cal.getTime());

Giá trị của newTimenhững thay đổi đối với 2011-50-07 17:50 nhưng nó phải như vậy 07-01-2011 17:50.

Nó thêm phút đúng nhưng nó cũng thay đổi tháng, không biết tại sao!



Câu trả lời:


193

Vấn đề đối với bạn là bạn đang sử dụng mm. Bạn nên sử dụng MM. MMlà tháng và mmlà phút. Hãy thử vớiyyyy-MM-dd HH:mm

Cách tiếp cận khác:

Nó có thể đơn giản như thế này (tùy chọn khác là sử dụng joda-time )

static final long ONE_MINUTE_IN_MILLIS=60000;//millisecs

Calendar date = Calendar.getInstance();
long t= date.getTimeInMillis();
Date afterAddingTenMins=new Date(t + (10 * ONE_MINUTE_IN_MILLIS));

cảm ơn, tôi đã thử điều này, ngày đang đến chính xác, nhưng khi tôi cố gắng thay đổi nó thành chuỗi, nó cho tôi cùng một kết quả sai String newTime = df.format (afterAddingTenMins); nó mang lại cho tôi 2011-50-07 17:50, tôi phải chuyển đổi nó trong String, bất cứ đề nghị
junaidp

1
@junaidp bạn đã sử dụng đoạn mã sau nhưng bỏ qua phần trước của giải pháp?
Carl

57

bạn có thể sử dụng lớp DateUtils trong gói org.apache.commons.lang3.time

int addMinuteTime = 5;
Date targetTime = new Date(); //now
targetTime = DateUtils.addMinutes(targetTime, addMinuteTime); //add minute

1
Đối với folks đối phó với phiên bản cũ của DateUtils, hiện tại của nó trong gói ->org.apache.commons.lang.time.DateUtils
realPK

32

Phương pháp thuận tiện để thực hiện câu trả lời của @ Pangea:

/*
*  Convenience method to add a specified number of minutes to a Date object
*  From: http://stackoverflow.com/questions/9043981/how-to-add-minutes-to-my-date
*  @param  minutes  The number of minutes to add
*  @param  beforeTime  The time that will have minutes added to it
*  @return  A date object with the specified number of minutes added to it 
*/
private static Date addMinutesToDate(int minutes, Date beforeTime){
    final long ONE_MINUTE_IN_MILLIS = 60000;//millisecs

    long curTimeInMs = beforeTime.getTime();
    Date afterAddingMins = new Date(curTimeInMs + (minutes * ONE_MINUTE_IN_MILLIS));
    return afterAddingMins;
}

26

Để tránh bất kỳ sự phụ thuộc nào, bạn có thể sử dụng java.util.Calendar như sau:

    Calendar now = Calendar.getInstance();
    now.add(Calendar.MINUTE, 10);
    Date teenMinutesFromNow = now.getTime();

Trong Java 8, chúng tôi có API mới:

    LocalDateTime dateTime = LocalDateTime.now().plus(Duration.of(10, ChronoUnit.MINUTES));
    Date tmfn = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());

17

Điều này được chỉ định không chính xác:

SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");

Bạn đang sử dụng phút thay vì tháng (MM)


6

tl; dr

LocalDateTime.parse( 
    "2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )

java.time

Sử dụng các lớp java.time tuyệt vời cho công việc ngày giờ. Các lớp này thay thế các lớp ngày-giờ cũ rắc rối như java.util.Datejava.util.Calendar.

ISO 8601

Các lớp java.time sử dụng các định dạng ISO 8601 tiêu chuẩn theo mặc định để phân tích cú pháp / tạo các chuỗi giá trị ngày-giờ. Để làm cho chuỗi đầu vào của bạn tuân thủ, hãy thay thế dấu cách ở giữa bằng một T.

String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "T" );

LocalDateTime

Phân tích cú pháp chuỗi đầu vào của bạn dưới dạng chuỗi ký tự vì LocalDateTimenó thiếu bất kỳ thông tin nào về múi giờ hoặc offset-from-UTC.

LocalDateTime ldt = LocalDateTime.parse( inputModified );

Thêm mười phút.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

ldt.toString (): 2016-01-23T12: 34

ldtLater.toString (): 2016-01-23T12: 44

Xem mã trực tiếp trong IdeOne.com .

Không LocalDateTimecó múi giờ, vì vậy nó không đại diện cho một điểm trên dòng thời gian. Áp dụng múi giờ để dịch sang một thời điểm thực tế. Chỉ định một tên múi giờ thích hợp trong các định dạng của continent/region, chẳng hạn như America/Montreal, Africa/Casablancahoặc Pacific/Auckland, hoặc Asia/Karachi. Không bao giờ sử dụng từ viết tắt 3-4 chữ cái như ESThoặc ISThoặc PKTvì chúng không phải là múi giờ thực, không được tiêu chuẩn hóa và thậm chí không phải là duy nhất (!).

ZonedDateTime

Nếu bạn biết múi giờ dự định cho giá trị này, hãy áp dụng a ZoneIdđể nhận được a ZonedDateTime.

ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );

zdt.toString (): 2016-01-23T12: 44 + 05: 00 [Châu Á / Karachi]

Dị thường

Hãy nghĩ xem nên thêm mười phút đó trước hay sau khi thêm múi giờ. Bạn có thể nhận được một kết quả rất khác do các điểm bất thường như Giờ tiết kiệm ánh sáng ban ngày (DST) làm thay đổi thời gian trên đồng hồ treo tường .

Việc bạn nên thêm 10 phút trước hay sau khi thêm vùng phụ thuộc vào ý nghĩa của kịch bản và quy tắc kinh doanh của bạn.

Mẹo: Khi bạn dự định một thời điểm cụ thể trên dòng thời gian, hãy luôn giữ thông tin múi giờ . Đừng làm mất thông tin đó, như đã làm với dữ liệu đầu vào của bạn. Giá trị 12:34có nghĩa là buổi trưa ở Pakistan hoặc buổi trưa ở Pháp hoặc buổi trưa ở Québec? Nếu bạn muốn nói buổi trưa ở Pakistan, hãy nói như vậy bằng cách bao gồm ít nhất là offset-from-UTC ( +05:00), và tốt hơn nữa là tên của múi giờ ( Asia/Karachi).

Instant

Nếu bạn muốn có khoảnh khắc giống như được nhìn qua lăng kính của UTC , hãy trích xuất một Instant. Các Instantlớp đại diện cho một thời điểm trên Timeline trong UTC với độ phân giải nano giây (lên đến chín (9) chữ số của một phân số thập phân).

Instant instant = zdt.toInstant();

Đổi

Tránh các lớp ngày-giờ cũ rắc rối bất cứ khi nào có thể. Nhưng nếu phải, bạn có thể chuyển đổi. Gọi các phương thức mới được thêm vào các lớp cũ.

java.util.Date utilDate = java.util.Date.from( instant );

Giới thiệu về java.time

Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date, Calendar, & SimpleDateFormat.

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang java.time.

Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow để có nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .

Lấy các lớp java.time ở đâu?

  • Java SE 8 SE 9 trở lên
    • Được xây dựng trong.
    • Một phần của API Java tiêu chuẩn với triển khai theo gói.
    • Java 9 bổ sung một số tính năng nhỏ và các bản sửa lỗi.
  • Java SE 6 SE 7
    • Phần lớn chức năng của java.time được chuyển ngược sang Java 6 & 7 trong ThreeTen-Backport .
  • Android

Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là cơ sở chứng minh cho những bổ sung có thể có trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval, YearWeek, YearQuarter, và nhiều hơn nữa .


4

Đã xảy ra lỗi trong mẫu SimpleDateFormat của bạn. nó phải là

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");

4

sử dụng định dạng này,

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");

mm cho phút và MM cho mounth


2

Sau khi bạn đã phân tích cú pháp ngày tháng, tôi sử dụng chức năng tiện ích này để thêm giờ, phút hoặc giây:

public class DateTimeUtils {
    private static final long ONE_HOUR_IN_MS = 3600000;
    private static final long ONE_MIN_IN_MS = 60000;
    private static final long ONE_SEC_IN_MS = 1000;

    public static Date sumTimeToDate(Date date, int hours, int mins, int secs) {
        long hoursToAddInMs = hours * ONE_HOUR_IN_MS;
        long minsToAddInMs = mins * ONE_MIN_IN_MS;
        long secsToAddInMs = secs * ONE_SEC_IN_MS;
        return new Date(date.getTime() + hoursToAddInMs + minsToAddInMs + secsToAddInMs);
    }
}

Hãy cẩn thận khi thêm thời gian dài, 1 ngày không phải lúc nào cũng là 24 giờ (điều chỉnh kiểu tiết kiệm ánh sáng ban ngày, giây nhuận, v.v.), Calendarđược khuyến nghị cho điều đó.


1

Làm việc cho tôi DateUtils

//import
import org.apache.commons.lang.time.DateUtils

...

        //Added and removed minutes to increase current range dates
        Date horaInicialCorteEspecial = DateUtils.addMinutes(new Date(corteEspecial.horaInicial.getTime()),-1)
        Date horaFinalCorteEspecial = DateUtils.addMinutes(new Date(corteEspecial.horaFinal.getTime()),1)

2
Câu trả lời này cải thiện như thế nào so với câu trả lời từ năm ngoái được đăng bởi alireza alallah ? Ngoài ra, Câu hỏi đề cập đến phút, không phải giây.
Basil Bourque

1

Có thể được thực hiện mà không cần hằng số (như 3600000 ms là 1h)

public static Date addMinutesToDate(Date date, int minutes) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, minutes);
        return calendar.getTime();
    }

public static Date addHoursToDate(Date date, int hours) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, hours);
    return calendar.getTime();
}

ví dụ về cách sử dụng:

System.out.println(new Date());
System.out.println(addMinutesToDate(new Date(), 5));

Tue May 26 16:16:14 CEST 2020
Tue May 26 16:21:14 CEST 2020

1
Các lớp ngày-thời gian khủng khiếp này đã được thay thế nhiều năm trước bởi các lớp java.time hiện đại , kể từ khi áp dụng JSR 310.
Basil Bourque

-2

Chỉ dành cho bất kỳ ai quan tâm. Tôi đang làm việc trên một dự án iOS yêu cầu chức năng tương tự vì vậy tôi đã kết thúc việc chuyển câu trả lời của @jeznag để nhanh chóng

private func addMinutesToDate(minutes: Int, beforeDate: NSDate) -> NSDate {
    var SIXTY_SECONDS = 60

    var m = (Double) (minutes * SIXTY_SECONDS)
    var c =  beforeDate.timeIntervalSince1970  + m
    var newDate = NSDate(timeIntervalSince1970: c)

    return newDate
}

Ngày từ Swift đã có sẵn chức năng tích hợp tương tự, ví dụ: Date (timeInterval:, kể từ:)
Albert
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.