【发布时间】:2009-04-17 04:31:56
【问题描述】:
我在项目中有以下需求。
我有一个名称为startDate 的输入字段,用户以YYYY-MM-DD HH:MM:SS 的格式输入。
我需要为 startDate 字段中的用户输入添加两个小时。我该怎么做。
提前致谢
【问题讨论】:
-
误读为“stardate”。我什至不喜欢星际迷航。
我在项目中有以下需求。
我有一个名称为startDate 的输入字段,用户以YYYY-MM-DD HH:MM:SS 的格式输入。
我需要为 startDate 字段中的用户输入添加两个小时。我该怎么做。
提前致谢
【问题讨论】:
试试这个,我测试了,效果很好
Date date = null;
String str = "2012/07/25 12:00:00";
DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
date = formatter.parse(str);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.HOUR, 2);
System.out.println(calendar.getTime()); // Output : Wed Jul 25 14:00:00 IST 2012
如果你想转换你的输入类型而不是添加这个代码
formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
str=formatter.format(calendar.getTime());
System.out.println(str); // Output : 2012-07-25 14:00:00
【讨论】:
您可以使用 SimpleDateFormat 将字符串转换为日期。之后你有两个选择,
从该日期对象获取时间(以毫秒为单位),并添加两个小时,例如 (2 * 60 * 60 * 1000)
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// replace with your start date string
Date d = df.parse("2008-04-16 00:05:05");
Calendar gc = new GregorianCalendar();
gc.setTime(d);
gc.add(Calendar.HOUR, 2);
Date d2 = gc.getTime();
或者,
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// replace with your start date string
Date d = df.parse("2008-04-16 00:05:05");
Long time = d.getTime();
time +=(2*60*60*1000);
Date d2 = new Date(time);
看看这些教程。
【讨论】:
这将为您提供所需的时间(例如:21:31 PM)
//Add 2 Hours to just TIME
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss a");
Date date2 = formatter.parse("19:31:51 PM");
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
cal2.add(Calendar.HOUR_OF_DAY, 2);
SimpleDateFormat printTimeFormat = new SimpleDateFormat("HH:mm a");
System.out.println(printTimeFormat.format(cal2.getTime()));
【讨论】:
LocalDateTime.parse(
"2018-01-23 01:23:45".replace( " " , "T" )
).plusHours( 2 )
现代方法使用添加到 Java 8、Java 9 及更高版本的 java.time 类。
用户输入格式为 YYYY-MM-DD HH:MM:SS
将该输入字符串解析为日期时间对象。您的格式接近于符合标准 ISO 8601 格式,默认情况下在 java.time 类中用于解析/生成字符串。要完全遵守,请将中间的空格替换为T。
String input = "2018-01-23 01:23:45".replace( " " , "T" ) ; // Yields: 2018-01-23T01:23:45
解析为LocalDateTime,因为您的输入缺少任何时区指示符或与 UTC 的偏移量。
LocalDateTime ldt = LocalDateTime.parse( input ) ;
增加两个小时
java.time 类可以为您计算。
LocalDateTime twoHoursLater = ldt.plusHours( 2 ) ;
请注意,LocalDateTime 确实不代表时间线上的一个点。如果没有时区的上下文或与 UTC 的偏移量,它就没有真正的意义。名称的“本地”部分表示任何 地区或无 地区,而不是任何一个特定地区。仅仅说“1 月 21 日中午”可能意味着新西兰奥克兰的中午,这比法国巴黎的中午早几个小时。
要定义实际力矩,您必须指定区域或偏移量。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ; // Define an actual moment, a point on the timeline by giving a context with time zone.
如果您确定预期的时区,请在添加两个小时之前应用它。 LocalDateTime 类在进行数学运算时假定简单的通用 24 小时工作日。但在不同日期的不同时区,天数可能是 23 或 25 小时,也可能是其他长度。因此,为了在分区上下文中获得正确结果,请将小时数添加到您的 ZonedDateTime 而不是 LocalDateTime。
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。
【讨论】:
作为Joda Time 库的粉丝,您可以通过以下方式使用 Joda DateTime:
import org.joda.time.format.*;
import org.joda.time.*;
...
String dateString = "2009-04-17 10:41:33";
// parse the string
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime = formatter.parseDateTime(dateString);
// add two hours
dateTime = dateTime.plusHours(2); // easier than mucking about with Calendar and constants
System.out.println(dateTime);
如果您在此转换之前/之后仍需要使用java.util.Date 对象,Joda DateTime API 提供了一些简单的toDate() 和toCalendar() 方法以便于翻译。
与 Java 日期/日历 API 相比,Joda API 提供了更多便利。
【讨论】:
使用SimpleDateFormat 类parse() 方法。此方法将返回一个Date 对象。然后,您可以为此 Date 创建一个 Calendar 对象并为其添加 2 小时。
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = formatter.parse(theDateToParse);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.HOUR_OF_DAY, 2);
cal.getTime(); // This will give you the time you want.
【讨论】:
//the parsed time zone offset:
DateTimeFormatter dateFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
String fromDateTimeObj = "2011-01-03T12:00:00.000-0800";
DateTime fromDatetime = dateFormat.withOffsetParsed().parseDateTime(fromDateTimeObj);
【讨论】:
两次相加的基本程序:
您可以根据需要使用 if else 修改小时:分钟:秒。
该程序向您展示了如何将两个对象的值相加并返回另一个对象。
class demo
{private int hour,min,sec;
void input(int hour,int min,int sec)
{this.hour=hour;
this.min=min;
this.sec=sec;
}
demo add(demo d2)//demo because we are returning object
{ demo obj=new demo();
obj.hour=hour+d2.hour;
obj.min=min+d2.min;
obj.sec=sec+d2.sec;
return obj;//Returning object and later on it gets allocated to demo d3
}
void display()
{
System.out.println(hour+":"+min+":"+sec);
}
public static void main(String args[])
{
demo d1=new demo();
demo d2=new demo();
d1.input(2, 5, 10);
d2.input(3, 3, 3);
demo d3=d1.add(d2);//Note another object is created
d3.display();
}
}
修正时间加法
class demo
{private int hour,min,sec;
void input(int hour,int min,int sec)
{this.hour=(hour>12&&hour<24)?(hour-12):hour;
this.min=(min>60)?0:min;
this.sec=(sec>60)?0:sec;
}
demo add(demo d2)
{ demo obj=new demo();
obj.hour=hour+d2.hour;
obj.min=min+d2.min;
obj.sec=sec+d2.sec;
if(obj.sec>60)
{obj.sec-=60;
obj.min++;
}
if(obj.min>60)
{ obj.min-=60;
obj.hour++;
}
return obj;
}
void display()
{
System.out.println(hour+":"+min+":"+sec);
}
public static void main(String args[])
{
demo d1=new demo();
demo d2=new demo();
d1.input(12, 55, 55);
d2.input(12, 7, 6);
demo d3=d1.add(d2);
d3.display();
}
}
【讨论】:
此示例是日期时间和时区的总和(字符串值)
String DateVal = "2015-03-26 12:00:00";
String TimeVal = "02:00:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm:ss");
Date reslt = sdf.parse( DateVal );
Date timeZ = sdf2.parse( TimeVal );
//Increase Date Time
reslt.setHours( reslt.getHours() + timeZ.getHours());
reslt.setMinutes( reslt.getMinutes() + timeZ.getMinutes());
reslt.setSeconds( reslt.getSeconds() + timeZ.getSeconds());
System.printLn.out( sdf.format(reslt) );//Result(+2 Hours): 2015-03-26 14:00:00
谢谢:)
【讨论】: