Bagaimana menambahkan menit ke Kencan saya


110

Saya memiliki objek tanggal ini:

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

nilai d1 adalah Fri Jan 07 17:40:00 PKT 2011

Sekarang saya mencoba menambahkan 10 menit ke tanggal di atas.

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

Nilai newTimeperubahan 2011-50-07 17:50 tetapi seharusnya 07-01-2011 17:50.

Itu menambahkan menit dengan benar tetapi juga mengubah bulan, tidak tahu mengapa!



Jawaban:


193

Masalah bagi Anda adalah apa yang Anda gunakan mm. Anda harus menggunakan MM. MMuntuk bulan dan mmuntuk menit. Coba denganyyyy-MM-dd HH:mm

Pendekatan lain:

Ini bisa sesederhana ini (opsi lain adalah menggunakan 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));

terima kasih, saya mencoba ini, tanggal datang dengan benar, tetapi ketika saya mencoba mengubahnya sebagai string, itu memberi saya hasil yang salah String newTime = df.format (afterAddingTenMins); itu memberi saya 2011-50-07 17:50, saya harus mengubahnya dalam String, ada saran
junaidp

1
@junaidp Anda menggunakan sedikit kode terakhir, tetapi mengabaikan bagian sebelumnya dari solusi?
Carl

57

Anda dapat menggunakan kelas DateUtils dalam paket org.apache.commons.lang3.time

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

1
Untuk orang-orang yang berurusan dengan versi DateUtils, ini hadir dalam paket ->org.apache.commons.lang.time.DateUtils
realPK

32

Metode kenyamanan untuk mengimplementasikan jawaban @ 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

Untuk menghindari ketergantungan Anda dapat menggunakan java.util.Calendar sebagai berikut:

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

Di Java 8 kami memiliki API baru:

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

17

Ini salah ditentukan:

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

Anda menggunakan menit, bukan bulan (MM)


6

tl; dr

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

java.time

Gunakan kelas java.time yang sangat baik untuk pekerjaan tanggal-waktu. Kelas-kelas ini menggantikan kelas tanggal-waktu lama yang merepotkan seperti java.util.Datedan java.util.Calendar.

ISO 8601

Kelas java.time menggunakan format ISO 8601 standar secara default untuk mem -parsing / menghasilkan string nilai tanggal-waktu. Untuk membuat string masukan Anda sesuai, ganti SPASI di tengah dengan a T.

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

LocalDateTime

Parsing string input Anda LocalDateTimekarena tidak memiliki info tentang zona waktu atau offset-dari-UTC.

LocalDateTime ldt = LocalDateTime.parse( inputModified );

Tambahkan sepuluh menit.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

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

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

Lihat kode langsung di IdeOne.com .

Itu LocalDateTimetidak memiliki zona waktu, jadi itu tidak mewakili satu titik di garis waktu. Terapkan zona waktu untuk menerjemahkan ke momen aktual. Tentukan nama zona waktu yang tepat dalam format continent/region, seperti America/Montreal, Africa/Casablanca, atau Pacific/Auckland, atau Asia/Karachi. Jangan pernah menggunakan singkatan 3-4 huruf seperti ESTatau ISTatau PKTkarena itu bukan zona waktu yang sebenarnya, tidak standar, dan bahkan tidak unik (!).

ZonedDateTime

Jika Anda mengetahui zona waktu yang dimaksudkan untuk nilai ini, terapkan a ZoneIduntuk mendapatkan a ZonedDateTime.

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

zdt.toString (): 2016-01-23T12: 44 + 05: 00 [Asia / Karachi]

Anomali

Pikirkan apakah akan menambahkan sepuluh menit itu sebelum atau sesudah menambahkan zona waktu. Anda mungkin mendapatkan hasil yang sangat berbeda karena anomali seperti Daylight Saving Time (DST) yang menggeser waktu jam dinding .

Apakah Anda harus menambahkan 10 menit sebelum atau setelah menambahkan zona bergantung pada arti skenario dan aturan bisnis Anda.

Tip: Ketika Anda berniat untuk momen tertentu di timeline, selalu simpan informasi zona waktu . Jangan sampai kehilangan info itu, seperti yang dilakukan dengan data masukan Anda. Apakah nilai 12:34dimaksudkan untuk siang hari di Pakistan atau tengah hari di Prancis atau tengah hari di Québec? Jika Anda bermaksud tengah hari di Pakistan, katakan demikian dengan memasukkan setidaknya offset-from-UTC ( +05:00), dan lebih baik lagi, nama zona waktu ( Asia/Karachi).

Instant

Jika Anda menginginkan momen yang sama seperti yang terlihat melalui lensa UTC , ekstrak file Instant. The Instantkelas merupakan saat di timeline di UTC dengan resolusi nanodetik (hingga sembilan (9) angka dari pecahan desimal).

Instant instant = zdt.toInstant();

Mengubah

Hindari kelas waktu kencan lama yang merepotkan jika memungkinkan. Tetapi jika Anda harus, Anda dapat bertobat. Panggil metode baru yang ditambahkan ke kelas lama.

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

Tentang java.time

The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date, Calendar, & SimpleDateFormat.

Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke java.time.

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .

Dimana mendapatkan kelas java.time?

  • Java SE 8 dan SE 9 dan yang lebih baru
    • Bawaan.
    • Bagian dari Java API standar dengan implementasi yang dibundel.
    • Java 9 menambahkan beberapa fitur dan perbaikan kecil.
  • Java SE 6 dan SE 7
    • Sebagian besar fungsionalitas java.time di-back-port ke Java 6 & 7 di ThreeTen-Backport .
  • Android

Proyek ThreeTen-Extra memperluas java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan java.time di masa mendatang. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .


4

Ada kesalahan dalam pola SimpleDateFormat Anda. harus

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

4

gunakan format ini,

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

mm untuk menit dan MM untuk mounth


2

Setelah Anda mengurai tanggal, saya menggunakan fungsi utilitas ini untuk menambahkan jam, menit atau detik:

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

Berhati-hatilah saat menambahkan periode waktu yang lama, 1 hari tidak selalu 24 jam (penyesuaian tipe Daylight Saving, Detik Kabisat, dan sebagainya), Calendardisarankan untuk itu.


1

Bekerja untuk saya 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
Bagaimana Jawaban ini memperbaiki Jawaban dari tahun lalu yang diposting oleh alireza alallah ? Juga, Pertanyaan mengacu pada menit, bukan detik.
Basil Bourque

1

Dapat dilakukan tanpa konstanta (seperti 3600000 ms adalah 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();
}

contoh penggunaan:

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
Kelas tanggal-waktu yang mengerikan ini telah digantikan bertahun-tahun yang lalu oleh kelas java.time modern , pada penerapan JSR 310.
Basil Bourque

-2

Hanya untuk siapa saja yang tertarik. Saya sedang mengerjakan proyek iOS yang membutuhkan fungsionalitas serupa, jadi saya akhirnya mentransfer jawaban @jeznag ke cepat

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
}

Tanggal dari Swift sudah memiliki fungsi bawaan yang serupa, misalnya Tanggal (timeInterval:, sejak:)
Albert
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.