Java时间操作 - 减去2个字符串

时间:2014-05-30 02:09:51

标签: java xml string swing jodatime

我使用xpath从XML文件中提取2个时间值(作为字符串),这些值(例如)如下:

0时07分

08:00

00:07等于7分钟

08:00表示早上8点,没有关联或需要的日期(在其他地方处理)

我读取的每个XML文件中的每个值都会发生变化。我想做的是如下:

  1. 我需要从早上8点减去或添加(视具体情况而定)7分钟,然后在一个字符串中给我一个hh:mm时间(例如:07:53或08:07),我最终可以输出到CSV < / LI>
  2. 接下来我需要产生2个额外的琴弦,1分钟前和1分钟后(例如:07:52和07:54或08:06和08:08),这些琴弦也需要输出到CSV
  3. 我已经尝试了所有的东西,我可以想到与时间解释和操作相关的时间减去/添加到时间然后从那里+/- 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

    我已经尝试过如此多的代码排列,因为它是无法编译的,我现在正在删除并从头开始重新开始,而且我还没有足够的经验来解决这个问题。

4 个答案:

答案 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.Datejava.text.SimpleDateFormat等):

Joda-Time具有几种不同时间类型的巨大优势。处理普通墙时间的正确类型是LocalTime。它还定义了一种添加分钟的方法。

您的任务:

  1. 我需要从早上8点开始减去或添加(视具体情况而定)7分钟,然后在一个字符串中给我一个hh:mm时间(例如:07:53或08:07),我最终可以输出到CSV

  2. 接下来我需要产生2个额外的琴弦,1分钟前和1分钟后(例如:07:52和07:54或08:06和08:08),这些琴弦也需要输出到CSV < / p>

  3. 解决方案(仅适用于第一部分,另一部分非常相似):

    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)