ฉันจะเพิ่ม n ชั่วโมงให้กับวัตถุวันที่ได้อย่างไร ฉันพบอีกตัวอย่างหนึ่งที่ใช้วันใน StackOverflow แต่ยังไม่เข้าใจว่าจะทำอย่างไรกับชั่วโมง
ฉันจะเพิ่ม n ชั่วโมงให้กับวัตถุวันที่ได้อย่างไร ฉันพบอีกตัวอย่างหนึ่งที่ใช้วันใน StackOverflow แต่ยังไม่เข้าใจว่าจะทำอย่างไรกับชั่วโมง
คำตอบ:
ตรวจสอบCalendar
ชั้นเรียน มันมีadd
วิธีการ (และอื่น ๆ ) เพื่อให้สามารถปรับเวลาได้
สิ่งนี้ควรใช้งานได้:
Calendar cal = Calendar.getInstance(); // creates calendar
cal.setTime(new Date()); // sets calendar time/date
cal.add(Calendar.HOUR_OF_DAY, 1); // adds one hour
cal.getTime(); // returns new date object plus one hour
ตรวจสอบAPIเพิ่มเติม
Calendar.add()
จะดูแลโดยอัตโนมัติ
java.util.Date
, java.util.Calendar
และjava.text.SimpleDateFormat
ตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และ Java 9 โปรดดูที่การสอนโดยออราเคิล
หากคุณใช้Apache Commons / Langคุณสามารถทำได้ในขั้นตอนเดียวโดยใช้DateUtils.addHours()
:
Date newDate = DateUtils.addHours(oldDate, 3);
(วัตถุเดิมไม่เปลี่ยนแปลง)
DateUtils.addHours(oldDate, -1);
เพื่อลดความซับซ้อนของตัวอย่างของ @ Christopher
สมมติว่าคุณมีค่าคงที่
public static final long HOUR = 3600*1000; // in milli-seconds.
คุณสามารถเขียน.
Date newDate = new Date(oldDate.getTime() + 2 * HOUR);
หากคุณใช้longเพื่อจัดเก็บวันที่ / เวลาแทนวัตถุ Date คุณสามารถทำได้
long newDate = oldDate + 2 * HOUR;
myJavaUtilDate.toInstant()
.plusHours( 8 )
หรือ…
myJavaUtilDate.toInstant() // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
.plus( // Do the math, adding a span of time to our moment, our `Instant`.
Duration.ofHours( 8 ) // Specify a span of time unattached to the timeline.
) // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.
เฟรมเวิร์ก java.time ที่สร้างใน Java 8 และใหม่กว่าแทนที่คลาส Java.util.Date/.Calendar เก่า ชนชั้นเก่าเหล่านั้นเป็นเรื่องยากลำบาก หลีกเลี่ยงพวกเขา
ใช้toInstant
เมธอดที่เพิ่งเพิ่มลงใน java.util.Date เพื่อแปลงจากประเภทเก่าเป็นประเภท java.time ใหม่ Instant
เป็นช่วงเวลาบนเส้นเวลาในUTCมีความละเอียดของนาโนวินาที
Instant instant = myUtilDate.toInstant();
คุณสามารถเพิ่มชั่วโมงได้Instant
โดยส่งผ่านTemporalAmount
เช่นDuration
.
Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );
หากต้องการอ่านว่าวันเวลาสร้าง String ในรูปแบบมาตรฐาน ISO 8601 toString
โดยการเรียก
String output = instantHourLater.toString();
คุณอาจต้องการที่จะเห็นช่วงเวลาที่ผ่านเลนส์ของภูมิภาคบางเวลาผนังนาฬิกา ปรับInstant
เป็นโซนเวลาที่คุณต้องการ / คาดหวังโดยสร้างไฟล์ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
หรือคุณสามารถโทรplusHours
เพื่อเพิ่มจำนวนชั่วโมงได้ การแบ่งเขตหมายถึงเวลาออมแสง (DST) และความผิดปกติอื่น ๆ จะได้รับการจัดการในนามของคุณ
ZonedDateTime later = zdt.plusHours( 8 );
คุณควรหลีกเลี่ยงการใช้การเรียนวันที่เก่าเวลารวมและjava.util.Date
.Calendar
แต่ถ้าคุณต้องการอย่างแท้จริงjava.util.Date
สำหรับการทำงานร่วมกันกับการเรียนไม่ได้ปรับปรุงประเภท java.time, แปลงจากผ่านZonedDateTime
Instant
วิธีการใหม่ที่เพิ่มเข้ามาในคลาสเก่าช่วยอำนวยความสะดวกในการแปลงเป็น / จากประเภท java.time
java.util.Date date = java.util.Date.from( later.toInstant() );
สำหรับการสนทนาเพิ่มเติมเกี่ยวกับการแปลงโปรดดูคำตอบของฉันสำหรับคำถามแปลง java.util วันที่ประเภท "java.time" คืออะไร .
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, และCalendar
SimpleDateFormat
โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำให้ย้ายไปที่คลาสjava.time
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่จำเป็นต้องมีสตริงไม่จำเป็นต้องมีjava.sql.*
คลาส
จะหาคลาส java.time ได้ที่ไหน?
โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โปรเจ็กต์นี้เป็นพื้นที่พิสูจน์สำหรับการเพิ่ม java.time ในอนาคต คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval
, YearWeek
, YearQuarter
และอื่น ๆ อีกมากมาย
ด้วยJoda-Time
DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
ClassNotDefinedException
ZonedDateTime
ใช้ไฟล์LocalDateTime
. "ท้องถิ่น" หมายถึงไม่เชื่อมโยงกับท้องถิ่นใดพื้นที่หนึ่งและไม่เชื่อมโยงกับไทม์ไลน์ เช่นเดียวกับ "คริสต์มาสเริ่มเวลาเที่ยงคืนของวันที่ 25 ธันวาคม 2015" เป็นช่วงเวลาที่แตกต่างกันในเขตเวลาต่างๆโดยไม่มีความหมายจนกว่าคุณจะใช้เขตเวลาใดเขตเวลาหนึ่งเพื่อให้ได้ช่วงเวลาที่เฉพาะเจาะจงบนเส้นเวลา นอกจากนี้หากไม่มีโซนเวลา Daylight Saving Time (DST) และความผิดปกติอื่น ๆ จะไม่ได้รับการจัดการด้วยการใช้ LocalDateTime ดังกล่าว ดูคำตอบของฉันโดยเปรียบเทียบ
java.util.Date
วัตถุตามที่ผู้ร้องขอถามเราZonedDateTime.toInstant()
และDate.from()
ตามที่อธิบายไว้ที่นี่stackoverflow.com/a/32274725/5661065
การใช้คลาสjava.util.concurrent.TimeUnitใหม่คุณสามารถทำได้เช่นนี้
Date oldDate = new Date(); // oldDate == current time
Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Add 2 hours
สิ่งที่ต้องการ:
Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() +
(2L * hoursInMillis)); // Adds 2 hours
java.util.Date
, java.util.Calendar
และjava.text.SimpleDateFormat
ตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และ Java 9 โปรดดูที่การสอนโดยออราเคิล
นี่เป็นโค้ดอีกชิ้นเมื่อDate
ออบเจ็กต์ของคุณอยู่ในรูปแบบ Datetime ความสวยงามของรหัสนี้คือหากคุณให้จำนวนชั่วโมงมากขึ้นวันที่จะอัปเดตตามนั้น
String myString = "09:00 12/12/2014";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy");
Date myDateTime = null;
//Parse your string to SimpleDateFormat
try
{
myDateTime = simpleDateFormat.parse(myString);
}
catch (ParseException e)
{
e.printStackTrace();
}
System.out.println("This is the Actual Date:"+myDateTime);
Calendar cal = new GregorianCalendar();
cal.setTime(myDateTime);
//Adding 21 Hours to your Date
cal.add(Calendar.HOUR_OF_DAY, 21);
System.out.println("This is Hours Added Date:"+cal.getTime());
นี่คือผลลัพธ์:
This is the Actual Date:Fri Dec 12 09:00:00 EST 2014
This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014
Date argDate = new Date(); //set your date.
String argTime = "09:00"; //9 AM - 24 hour format :- Set your time.
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
String dateTime = sdf.format(argDate) + " " + argTime;
Date requiredDate = dateFormat.parse(dateTime);
หากคุณต้องการใช้java.time
นี่คือวิธีการเพิ่มระยะเวลาที่จัดรูปแบบ ISO 8601:
import java.time.Duration;
import java.time.LocalDateTime;
...
LocalDateTime yourDate = ...
...
// Adds 1 hour to your date.
yourDate = yourDate.plus(Duration.parse("PT1H")); // Java.
// OR
yourDate = yourDate + Duration.parse("PT1H"); // Groovy.
Duration.parse(iso8601duration)
เป็นที่น่าสนใจขอบคุณ แต่คุณไม่สามารถใช้ประกอบการ+
บนLocalDateTime
คุณอาจต้องการที่จะแก้ไขว่า แต่.plus(...)
ไม่ได้ผล
Date
วัตถุซึ่งแสดงถึงช่วงเวลาที่เฉพาะเจาะจงใน UTC การใช้งานของคุณLocalDateTime
ล้มเหลวในการตอบคำถาม LocalDateTime
ไม่มีแนวคิดเกี่ยวกับเขตเวลาหรือ offset-from-UTC ดังนั้นจึงไม่สามารถแสดงช่วงเวลาได้ ชั้นผิดสำหรับปัญหานี้ ดูความแตกต่างระหว่าง Instant และ LocalDateTime คืออะไร
Date
วัตถุ@BasilBourque เลิกใช้แล้ว คำถามไม่ชัดเจนเมื่อพูดถึงเขตเวลาดังนั้นคำตอบของฉันจึงยืน นอกจากนี้คุณสามารถเปลี่ยนLocalDateTime
เป็นZonedDateTime
ไฟล์.
คุณสามารถทำได้ด้วย Joda DateTime API
DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
โดยใช้คลาส Java 8 เราสามารถจัดการวันที่และเวลาได้อย่างง่ายดายดังต่อไปนี้
LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);
Date
วัตถุซึ่งแสดงถึงช่วงเวลาที่เฉพาะเจาะจงใน UTC การใช้งานของคุณLocalDateTime
ล้มเหลวในการตอบคำถาม LocalDateTime
ไม่มีแนวคิดเกี่ยวกับเขตเวลาหรือ offset-from-UTC ดังนั้นจึงไม่สามารถแสดงช่วงเวลาได้ ชั้นผิดสำหรับปัญหานี้ ดูความแตกต่างระหว่าง Instant และ LocalDateTime คืออะไร
คุณสามารถใช้คลาส LocalDateTime จาก Java 8 ได้เช่น:
long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
Date
วัตถุซึ่งแสดงถึงช่วงเวลาที่เฉพาะเจาะจงใน UTC การใช้งานของคุณLocalDateTime
ล้มเหลวในการตอบคำถาม LocalDateTime
ไม่มีแนวคิดเกี่ยวกับเขตเวลาหรือ offset-from-UTC ดังนั้นจึงไม่สามารถแสดงช่วงเวลาได้ ชั้นผิดสำหรับปัญหานี้ ดูความแตกต่างระหว่าง Instant และ LocalDateTime คืออะไร
คุณสามารถใช้วิธีนี้เข้าใจง่ายและนำไปใช้:
public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.HOUR_OF_DAY, nombreHeure);
calendar.add(Calendar.MINUTE, nombreMinute);
calendar.add(Calendar.SECOND, nombreSeconde);
return calendar.getTime();
}