Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java时间操作-减去2个字符串_Java_Xml_String_Swing_Jodatime - Fatal编程技术网

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

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或

我使用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或08:06和08:08),它们也需要输出到CSV
  • 我已经尝试了一切,我能想到与时间解释和操作相关的方法,将分钟减去/增加到时间中,然后再减去+/-1分钟,但是作为一个完全的新手,尽管我尽可能多地阅读和测试,我还是完全被困在了里面。在过去的两天里,我第一次和Joda一起工作,但我肯定错过了一些基本的东西,因为我也无法得到想要的结果

    问题是——我如何才能做到这一点

    一些示例代码使我能够读取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的输出


    我已经尝试了太多的代码排列,我正处于删除和从头开始的阶段,因为它是不可编译的,而且我还没有足够的经验来解决这个问题。

    尝试将字符串传递到一个方法中,以及传递给你所使用的子方法

    然后将它们转换为整数

    然后有一个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的输出。谢谢-这个解决方案似乎适合我的要求!非常感谢。