วิธีเพิ่มนาทีในวันที่ของฉัน


110

ฉันมีวัตถุวันที่นี้:

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

ค่าของ d1 คือ Fri Jan 07 17:40:00 PKT 2011

ตอนนี้ฉันกำลังพยายามเพิ่ม 10 นาทีในวันที่ด้านบน

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

มูลค่าของnewTimeการเปลี่ยนแปลงแต่มันควรจะเป็น2011-50-07 17:50 07-01-2011 17:50

มันเพิ่มนาทีถูกต้อง แต่มันเปลี่ยนเดือนด้วยไม่รู้ทำไม!



คำตอบ:


193

mmปัญหาสำหรับคุณคือการที่คุณกำลังใช้ คุณควรใช้MM. MMเป็นเดือนและmmเป็นนาที ลองด้วยyyyy-MM-dd HH:mm

แนวทางอื่น ๆ :

สามารถทำได้ง่ายๆเพียงเท่านี้ (ตัวเลือกอื่นคือใช้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));

ขอบคุณฉันลองแล้ววันที่มาอย่างถูกต้อง แต่เมื่อฉันพยายามเปลี่ยนเป็นสตริงมันให้ผลลัพธ์ที่ผิดเหมือนกันกับฉัน String newTime = df.format (afterAddingTenMins); มันทำให้ฉัน 2011-50-07 17:50 ฉันต้องแปลงเป็นสตริงคำแนะนำใด ๆ
junaidp

1
@junaidp คุณใช้บิตหลังของโค้ด แต่ไม่สนใจส่วนเดิมของการแก้ปัญหา?
Carl

57

คุณสามารถใช้คลาส DateUtils ในแพ็คเกจ org.apache.commons.lang3.time

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

1
สำหรับผู้ที่เกี่ยวข้องกับ DateUtils เวอร์ชันเก่ามีอยู่ในแพ็คเกจ ->org.apache.commons.lang.time.DateUtils
realPK

32

วิธีที่สะดวกในการใช้คำตอบของ @ 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

เพื่อหลีกเลี่ยงการพึ่งพาใด ๆ คุณสามารถใช้ java.util.Calendar ดังต่อไปนี้:

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

ใน Java 8 เรามี API ใหม่:

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

17

ระบุไม่ถูกต้อง:

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

คุณกำลังใช้นาทีแทนเดือน (MM)


6

tl; dr

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

java.time

ใช้คลาส java.time ที่ยอดเยี่ยมสำหรับการทำงานวันที่และเวลา ชั้นเรียนเหล่านี้แย่งลำบากเก่าชั้นเรียนวันที่เวลาเช่นและjava.util.Datejava.util.Calendar

ISO 8601

คลาส java.time ใช้รูปแบบISO 8601 มาตรฐานโดยค่าเริ่มต้นสำหรับการแยกวิเคราะห์ / สร้างสตริงของค่าวันที่และเวลา ในการทำให้สตริงอินพุตของคุณสอดคล้องกันให้แทนที่ SPACE ตรงกลางด้วย a T.

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

LocalDateTime

แยกวิเคราะห์สตริงอินพุตของคุณLocalDateTimeเนื่องจากไม่มีข้อมูลเกี่ยวกับเขตเวลาหรือออฟเซ็ตจาก UTC

LocalDateTime ldt = LocalDateTime.parse( inputModified );

เพิ่มสิบนาที

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

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

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

ดูรหัสที่อาศัยอยู่ใน IdeOne.com

ที่LocalDateTimeมีโซนเวลาไม่นานจึงไม่ได้เป็นตัวแทนของจุดบนไทม์ไลน์ที่ ใช้เขตเวลาเพื่อแปลเป็นช่วงเวลาจริง ระบุชื่อโซนเวลาที่เหมาะสมในรูปแบบของcontinent/regionเช่นAmerica/Montreal, Africa/CasablancaหรือหรือPacific/Auckland Asia/Karachiอย่าใช้อักษรย่อ 3-4 ตัวเช่นESTหรือISTหรือPKTเนื่องจากไม่ใช่เขตเวลาจริงไม่เป็นมาตรฐานและไม่ซ้ำกัน (!)

ZonedDateTime

ถ้าคุณรู้ว่าโซนเวลาที่มีไว้สำหรับค่านี้ใช้จะได้รับZoneIdZonedDateTime

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

zdt.toString (): 2016-01-23T12: 44 + 05: 00 [เอเชีย / การาจี]

ความผิดปกติ

ลองนึกดูว่าควรเพิ่ม 10 นาทีก่อนหรือหลังเพิ่มเขตเวลา คุณอาจจะได้รับผลที่แตกต่างกันมากเพราะความผิดปกติเช่นปรับเวลาตามฤดูกาล (DST) ที่เปลี่ยนเวลาผนังนาฬิกา

คุณควรเพิ่ม 10 นาทีก่อนหรือหลังการเพิ่มโซนนั้นขึ้นอยู่กับความหมายของสถานการณ์และกฎทางธุรกิจของคุณ

เคล็ดลับ: เมื่อคุณตั้งใจขณะที่เฉพาะเจาะจงในระยะเวลาที่มักจะเก็บข้อมูลเขตเวลา อย่าให้ข้อมูลนั้นสูญหายเช่นเดียวกับข้อมูลที่คุณป้อน ค่านี้12:34หมายถึงเที่ยงในปากีสถานหรือเที่ยงในฝรั่งเศสหรือเที่ยงในควิเบก? หากคุณหมายถึงเวลาเที่ยงในปากีสถานให้พูดเช่นนั้นโดยใส่ offset-from-UTC ( +05:00) เป็นอย่างน้อยและดีกว่าคือชื่อของเขตเวลา ( Asia/Karachi)

Instant

หากคุณต้องการช่วงเวลาเดียวกับที่เห็นผ่านเลนส์ของUTCให้ดึงInstantไฟล์. Instantชั้นหมายถึงช่วงเวลาบนไทม์ไลน์ในส่วนUTCมีความละเอียดของนาโนวินาที (ถึงเก้า (9) ตัวเลขของส่วนทศนิยม)

Instant instant = zdt.toInstant();

แปลง

หลีกเลี่ยงคลาสวันเวลาเก่าที่ยุ่งยากทุกครั้งที่ทำได้ แต่ถ้าคุณต้องคุณสามารถแปลง เรียกเมธอดใหม่ที่เพิ่มในคลาสเก่า

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

เกี่ยวกับ java.time

java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date, และCalendarSimpleDateFormat

โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำให้ย้ายไปที่ java.time

ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310

จะหาคลาส java.time ได้ที่ไหน?

  • Java SE 8และ SE 9และใหม่กว่า
    • ในตัว.
    • ส่วนหนึ่งของ Java API มาตรฐานพร้อมการใช้งานแบบรวม
    • Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
  • Java SE 6และ SE 7
    • มากของการทำงาน java.time จะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
  • Android
    • ThreeTenABPโครงการปรับThreeTen-ย้ายกลับ (ดังกล่าวข้างต้น) สำหรับ Android โดยเฉพาะ
    • ดูวิธีใช้… .

โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โปรเจ็กต์นี้เป็นพื้นที่พิสูจน์สำหรับการเพิ่ม java.time ในอนาคต คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval, YearWeek, YearQuarterและอื่น ๆ อีกมากมาย


4

มีข้อผิดพลาดในรูปแบบของ SimpleDateFormat ของคุณ มันควรจะเป็น

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

4

ใช้รูปแบบนี้

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

mm สำหรับนาทีและ MM สำหรับ mounth


2

เมื่อคุณแยกวิเคราะห์วันที่แล้วฉันจะใช้ฟังก์ชันยูทิลิตี้นี้เพื่อเพิ่มชั่วโมงนาทีหรือวินาที:

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

โปรดใช้ความระมัดระวังเมื่อเพิ่มระยะเวลานาน 1 วันไม่ได้เป็น 24 ชั่วโมงเสมอไป ( Calendarขอแนะนำให้ปรับประเภทการออมแสงอธิกวินาทีเป็นต้น)


1

ทำงานให้ฉัน 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
อย่างไรคำตอบนี้ปรับปรุงในหนึ่งปีที่ผ่านมาจากการโพสต์โดย alallah Alireza ? นอกจากนี้คำถามที่อ้างถึงนาทีไม่ใช่วินาที
Basil Bourque

1

สามารถทำได้โดยไม่มีค่าคงที่ (เช่น 3600000 ms คือ 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();
}

ตัวอย่างการใช้งาน:

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
ชั้นเรียนวันที่ - เวลาที่น่ากลัวเหล่านี้ถูกแทนที่เมื่อหลายปีก่อนโดยคลาสjava.timeสมัยใหม่เนื่องจากการนำ JSR 310 มาใช้
Basil Bourque

-2

สำหรับใครที่สนใจ ฉันกำลังทำงานกับโปรเจ็กต์ iOS ที่ต้องใช้ฟังก์ชันการทำงานที่คล้ายกันดังนั้นฉันจึงสิ้นสุดการย้ายคำตอบโดย @jeznag ให้รวดเร็ว

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
}

วันที่จาก Swift มีฟังก์ชันบิลด์อินที่คล้ายกันอยู่แล้วเช่น Date (timeInterval:, since:)
Albert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.