Java时间操作-减去2个字符串
我使用xpath从XML文件中提取2个时间值(作为字符串),这些值(例如)如下所示: 00:07 08:00 00:07等于7分钟 08:00表示上午8点,没有相关或需要的日期(在别处处理) 在我读取的每个XML文件中,这些值都可能发生更改。我试图做的是如下:Java时间操作-减去2个字符串,java,xml,string,swing,jodatime,Java,Xml,String,Swing,Jodatime,我使用xpath从XML文件中提取2个时间值(作为字符串),这些值(例如)如下所示: 00:07 08:00 00:07等于7分钟 08:00表示上午8点,没有相关或需要的日期(在别处处理) 在我读取的每个XML文件中,这些值都可能发生更改。我试图做的是如下: 我需要从上午8点减去或加上(取决于情况)7分钟,然后在字符串中给我一个hh:mm时间(例如:07:53或08:07),我最终可以输出到CSV 接下来,我需要生成另外两个字符串,一个是前1分钟,一个是后1分钟(例如:07:52和07:54或
FileInputStream file = null;
try {
file = new FileInputStream(new File("Output/XmlConfig.xml"));
} catch (FileNotFoundException ex) {
Logger.getLogger(KATT.class.getName()).log(Level.SEVERE, null, ex);
}
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
builder = builderFactory.newDocumentBuilder();
} catch (ParserConfigurationException ex) {
Logger.getLogger(KATT.class.getName()).log(Level.SEVERE, null, ex);
}
Document xmlDocument = null;
try {
xmlDocument = builder.parse(file);
} catch (SAXException ex) {
Logger.getLogger(KATT.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(KATT.class.getName()).log(Level.SEVERE, null, ex);
}
XPath xPath = XPathFactory.newInstance().newXPath();
//get In Early rule from XML
String exceptionInEarlyXML = "Root/Response/WSAExceptionRule/@InEarly";
NodeList nodeListInEarly = null;
try {
nodeListInEarly = (NodeList) xPath.compile(exceptionInEarlyXML).evaluate(xmlDocument, XPathConstants.NODESET);
} catch (XPathExpressionException ex) {
Logger.getLogger(KATT.class.getName()).log(Level.SEVERE, null, ex);
}
String exceptionInEarly = (nodeListInEarly.item(1).getFirstChild().getNodeValue());
String InEarly = exceptionInEarly;
SimpleDateFormat format = new SimpleDateFormat("hh:mm");
Date d2 = null;
try {
d2 = format.parse(InEarly);
} catch (ParseException ex) {
Logger.getLogger(KATT.class.getName()).log(Level.SEVERE, null, ex);
}
DateTime dt2 = new DateTime(d2);
System.out.println(dt2);
这给了我一个1970-01-01T00:07:00.000+10:00的输出
我已经尝试了太多的代码排列,我正处于删除和从头开始的阶段,因为它是不可编译的,而且我还没有足够的经验来解决这个问题。尝试将字符串传递到一个方法中,以及传递给你所使用的子方法 然后将它们转换为整数 然后有一个if语句,如果减法量大于minets int 然后它从小时整数中减去1,并将新的minets整数设置为60减去减法整数 然后将它们转换回字符串 下面是将其转换回字符串的代码
public class Main {
static String hours="8";
static String minets="7";
static String minus="17";
public static void main(String[] args) {
Main m = new Main();
m.timechange(hours,minets,minus);
}
void timechange(String hour, String minuet, String subtract){
int h = Integer.parseInt(hour);
int m = Integer.parseInt(minuet);
int s = Integer.parseInt(subtract);
if(s>m){
h-=1;
m=60-s;
}
else{
m-=s;
}
if ((m>9)&&(h>9)) {
System.out.println(h+":"+m);
} else {if ((m<10)&&(h<10)) {
System.out.println("0"+h+":0"+m);
}else {if ((m<10)&&(h>9)) {
System.out.println(h+":0"+m);
}else {if ((m>9)&&(h<10)) {
System.out.println("0"+h+":"+m);
}
}
}
}
}}
公共类主{
静态字符串hours=“8”;
静态字符串minets=“7”;
静态字符串减号=“17”;
公共静态void main(字符串[]args){
Main m=新的Main();
m、 时间变化(小时、地雷、负);
}
无效时间更改(字符串小时、字符串小步舞曲、字符串减法){
int h=整数.parseInt(小时);
int m=整数.parseInt(小步舞);
int s=整数.parseInt(减法);
如果(s>m){
h-=1;
m=60-s;
}
否则{
m-=s;
}
如果((m>9)和&(h>9)){
System.out.println(h+“:”+m);
}else{if((m首先,需要使用SimpleDataFormat将日期字符串解析为Java.util.Date对象
第二,在获得日期对象之后,您可以轻松地添加/减去某个时间,并获得另一个日期对象
最后,可以使用另一个SimpleDataFormat对象将第二步中得到的日期对象格式化为字符串
SimpleDataFormat在处理日期字符串时非常有用。您可以在JDK中参考Javadoc,也可以通过Google搜索一些示例。一旦您拥有解析时间的日期对象,请使用getTime()以毫秒为单位获取时间并将其保存到长变量中。然后解析偏移时间格式并使用NumberFormat获取要偏移的分钟数。根据需要添加或减去。获取结果并创建新日期(毫秒),然后对其应用格式
以下是一个工作示例:
String sTime = "08:00";
String sOffset ="00:07";
SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm");
Date dtTime = null;
try {
dtTime = dateFormat.parse(sTime);
} catch (ParseException e) {
// handle exception
return;
}
String[] offsetHrsMins = null;
NumberFormat numberFormat = NumberFormat.getNumberInstance();
long offsetMillis = 0;
try {
offsetHrsMins = sOffset.split(":");
long offsetHrs = (Long) numberFormat.parse(offsetHrsMins[0]);
long offsetMins = (Long) numberFormat.parse(offsetHrsMins[1]);
offsetMillis = 1000 * 60 * ((offsetHrs * 60) + offsetMins);
} catch (ParseException e) {
// handle exception
return;
}
long lTime = dtTime.getTime();
System.out.println("Adding minutes: " + dateFormat.format(new Date(lTime + offsetMillis)));
System.out.println("Subtracting minutes: " + dateFormat.format(new Date(lTime - offsetMillis)));
输出:
Adding minutes: 08:07
Subtracting minutes: 07:53
这里是一个真正的JoDA时间解答,因为OP需要JoDA时间(我也认为库优于代码[java java .UTIL.DATE < /COD>,<代码> java.文本> SimuleDead格式< /Cuff>等):
Joda Time有很多不同的时间类型,这是它的一大优势。处理普通墙时间的正确类型是。它还定义了一种增加分钟数的方法
您的任务:
LocalTime time = new LocalTime(8, 0); // corresponds to 08:00
LocalTime laterBy8Minutes = time.plusMinutes(7);
LocalTime earlierBy8Minutes = time.minusMinutes(7);
String sLaterBy8Minutes = laterBy8Minutes.toString("HH:mm"); // 08:07
String sEarlierBy8Minutes = earlierBy8Minutes.toString("HH:mm"); // 07:53
我需要从上午8点减去或加上(取决于情况)7分钟,然后在字符串中给我一个hh:mm时间(例如:07:53或08:07),我最终可以输出到CSV
接下来,我需要生成另外两个字符串,一个是前1分钟,一个是后1分钟(例如:07:52和07:54或08:06和08:08),它们也需要输出到CSV
解决方案(仅第一部分,另一部分非常相似):
LocalTime time = new LocalTime(8, 0); // corresponds to 08:00
LocalTime laterBy8Minutes = time.plusMinutes(7);
LocalTime earlierBy8Minutes = time.minusMinutes(7);
String sLaterBy8Minutes = laterBy8Minutes.toString("HH:mm"); // 08:07
String sEarlierBy8Minutes = earlierBy8Minutes.toString("HH:mm"); // 07:53
另一个注意事项:如果您从另一个类型开始,如java.util.Date
,并希望将其转换为LocalTime
,则可以使用构造函数
new LocalTime(jdkDate, DateTimeZone.forID("Europe/Moscow")) // example
或默认时区:
new LocalTime(jdkDate)
如果您已经“尝试了一切”
并且“在过去的两天里……”
那么请向我们展示您的努力成果。1970-01-01T00:07:00.000+10:00有什么问题?我不知道如何从该值中减去x分钟(00:07基于我从xml中提取的另一个字符串)并给我一个07:53的输出。谢谢-这个解决方案似乎适合我的要求!非常感谢。