我使用xpath从XML文件中提取2个时间值(作为字符串),这些值(例如)如下:
0时07分
08:00
00:07等于7分钟
08:00表示早上8点,没有关联或需要的日期(在其他地方处理)
我读取的每个XML文件中的每个值都会发生变化。我想做的是如下:
我已经尝试了所有的东西,我可以想到与时间解释和操作相关的时间减去/添加到时间然后从那里+/- 1分钟,但作为一个完整的新手,我完全卡住了尽管尽可能多地阅读和测试。花了最近两天与Joda Time一起工作,但我必须遗漏一些基本的东西,因为我无法得到预期的结果。
问题是 - 我怎样才能实现这个目标?
一些示例代码让我从XML中读取并打印时间
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
我已经尝试过如此多的代码排列,因为它是无法编译的,我现在正在删除并从头开始重新开始,而且我还没有足够的经验来解决这个问题。
答案 0 :(得分:0)
尝试将字符串传递给方法,就像你通过
所做的那样然后将它们转换为整数
然后有一个if语句,如果减法量大于minets int 然后它从小时int中减去1并将新的矿井int设置为60减去减法int
然后将它们转换回字符串 以下是将其恢复为字符串
的代码 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);
}
}
}
}
}}
我不确定你是否想要回到String。 希望能回答你的问题 如果发生这种情况,那么当矿床达到60以上时也可以这样做。
答案 1 :(得分:0)
首先,您需要使用SimpleDateFormat将Date字符串解析为Java.util.Date对象。
其次,获取日期对象后,您可以轻松地添加/减去一些时间,并获得另一个日期对象。
最后,您可以使用另一个SimpleDateFormat对象将第二步中获得的Date对象格式化为String。
SimpleDateFormat在处理日期字符串中非常有用。您可以参考JDK中的Javadoc或通过Google搜索一些示例。
答案 2 :(得分:0)
获得解析时间的Date对象后,使用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
答案 3 :(得分:0)
这是一个真正的Joda-Time答案,因为OP想要Joda-Time(我也认为该库优于java.util.Date
,java.text.SimpleDateFormat
等):
Joda-Time具有几种不同时间类型的巨大优势。处理普通墙时间的正确类型是LocalTime。它还定义了一种添加分钟的方法。
您的任务:
我需要从早上8点开始减去或添加(视具体情况而定)7分钟,然后在一个字符串中给我一个hh:mm时间(例如:07:53或08:07),我最终可以输出到CSV
接下来我需要产生2个额外的琴弦,1分钟前和1分钟后(例如:07:52和07:54或08:06和08:08),这些琴弦也需要输出到CSV < / p>
解决方案(仅适用于第一部分,另一部分非常相似):
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)