从Android中指定的dateTime Kotlin获取几个小时之前的dateTime

从Android中指定的dateTime Kotlin获取几个小时之前的dateTime,datetime,simpledateformat,timeunit,android-dateutils,android-jodatime,Datetime,Simpledateformat,Timeunit,Android Dateutils,Android Jodatime,我想得到一个日期时间,它比指定的日期时间早几个小时。datetime将采用字符串格式,并且根据配置,需要在给定时间前n小时(例如,在给定时间前3或4小时)设置datetime 我的时间格式是2020-10-20T13:00:00-05:00,使用现代日期时间API: import java.time.OffsetDateTime; public class Main { public static void main(String[] args) { String da

我想得到一个日期时间,它比指定的日期时间早几个小时。datetime将采用字符串格式,并且根据配置,需要在给定时间前n小时(例如,在给定时间前3或4小时)设置datetime


我的时间格式是
2020-10-20T13:00:00-05:00

,使用现代日期时间API:

import java.time.OffsetDateTime;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        OffsetDateTime odt = OffsetDateTime.parse(dateTimeStr);
        System.out.println("Given date time: " + odt);

        // 3-hours ago
        OffsetDateTime threeHoursAgo = odt.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00-05:00
Three hours ago: 2020-10-20T10:00-05:00
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").withOffsetParsed();
        DateTime dateTime = dtf.parseDateTime(dateTimeStr);
        System.out.println("Given date time: " + dateTime);

        // 3-hours ago
        DateTime threeHoursAgo = dateTime.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00:00.000-05:00
Three hours ago: 2020-10-20T10:00:00.000-05:00
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT-5"));
        Date date = sdf.parse(dateTimeStr);
        System.out.println("Given date time: " + sdf.format(date));

        // 3-hours ago
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR, -3);
        System.out.println("Three hours ago: " + sdf.format(calendar.getTime()));
    }
}
Given date time: 2020-10-20T13:00:00-05:00
Three hours ago: 2020-10-20T10:00:00-05:00
输出:

import java.time.OffsetDateTime;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        OffsetDateTime odt = OffsetDateTime.parse(dateTimeStr);
        System.out.println("Given date time: " + odt);

        // 3-hours ago
        OffsetDateTime threeHoursAgo = odt.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00-05:00
Three hours ago: 2020-10-20T10:00-05:00
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").withOffsetParsed();
        DateTime dateTime = dtf.parseDateTime(dateTimeStr);
        System.out.println("Given date time: " + dateTime);

        // 3-hours ago
        DateTime threeHoursAgo = dateTime.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00:00.000-05:00
Three hours ago: 2020-10-20T10:00:00.000-05:00
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT-5"));
        Date date = sdf.parse(dateTimeStr);
        System.out.println("Given date time: " + sdf.format(date));

        // 3-hours ago
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR, -3);
        System.out.println("Three hours ago: " + sdf.format(calendar.getTime()));
    }
}
Given date time: 2020-10-20T13:00:00-05:00
Three hours ago: 2020-10-20T10:00:00-05:00
有关现代日期时间API的更多信息,请访问

如果您是为您的Android项目执行此操作,并且您的Android API级别仍然不符合Java-8,请检查并重试

使用Joda时间:

import java.time.OffsetDateTime;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        OffsetDateTime odt = OffsetDateTime.parse(dateTimeStr);
        System.out.println("Given date time: " + odt);

        // 3-hours ago
        OffsetDateTime threeHoursAgo = odt.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00-05:00
Three hours ago: 2020-10-20T10:00-05:00
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").withOffsetParsed();
        DateTime dateTime = dtf.parseDateTime(dateTimeStr);
        System.out.println("Given date time: " + dateTime);

        // 3-hours ago
        DateTime threeHoursAgo = dateTime.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00:00.000-05:00
Three hours ago: 2020-10-20T10:00:00.000-05:00
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT-5"));
        Date date = sdf.parse(dateTimeStr);
        System.out.println("Given date time: " + sdf.format(date));

        // 3-hours ago
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR, -3);
        System.out.println("Three hours ago: " + sdf.format(calendar.getTime()));
    }
}
Given date time: 2020-10-20T13:00:00-05:00
Three hours ago: 2020-10-20T10:00:00-05:00
输出:

import java.time.OffsetDateTime;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        OffsetDateTime odt = OffsetDateTime.parse(dateTimeStr);
        System.out.println("Given date time: " + odt);

        // 3-hours ago
        OffsetDateTime threeHoursAgo = odt.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00-05:00
Three hours ago: 2020-10-20T10:00-05:00
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").withOffsetParsed();
        DateTime dateTime = dtf.parseDateTime(dateTimeStr);
        System.out.println("Given date time: " + dateTime);

        // 3-hours ago
        DateTime threeHoursAgo = dateTime.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00:00.000-05:00
Three hours ago: 2020-10-20T10:00:00.000-05:00
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT-5"));
        Date date = sdf.parse(dateTimeStr);
        System.out.println("Given date time: " + sdf.format(date));

        // 3-hours ago
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR, -3);
        System.out.println("Three hours ago: " + sdf.format(calendar.getTime()));
    }
}
Given date time: 2020-10-20T13:00:00-05:00
Three hours ago: 2020-10-20T10:00:00-05:00
注意:请在

Joda Time是Java事实上的标准日期和时间库 在JavaSE8之前。现在要求用户迁移到java.time (JSR-310)

使用传统API:

import java.time.OffsetDateTime;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        OffsetDateTime odt = OffsetDateTime.parse(dateTimeStr);
        System.out.println("Given date time: " + odt);

        // 3-hours ago
        OffsetDateTime threeHoursAgo = odt.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00-05:00
Three hours ago: 2020-10-20T10:00-05:00
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").withOffsetParsed();
        DateTime dateTime = dtf.parseDateTime(dateTimeStr);
        System.out.println("Given date time: " + dateTime);

        // 3-hours ago
        DateTime threeHoursAgo = dateTime.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00:00.000-05:00
Three hours ago: 2020-10-20T10:00:00.000-05:00
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT-5"));
        Date date = sdf.parse(dateTimeStr);
        System.out.println("Given date time: " + sdf.format(date));

        // 3-hours ago
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR, -3);
        System.out.println("Three hours ago: " + sdf.format(calendar.getTime()));
    }
}
Given date time: 2020-10-20T13:00:00-05:00
Three hours ago: 2020-10-20T10:00:00-05:00
输出:

import java.time.OffsetDateTime;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        OffsetDateTime odt = OffsetDateTime.parse(dateTimeStr);
        System.out.println("Given date time: " + odt);

        // 3-hours ago
        OffsetDateTime threeHoursAgo = odt.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00-05:00
Three hours ago: 2020-10-20T10:00-05:00
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").withOffsetParsed();
        DateTime dateTime = dtf.parseDateTime(dateTimeStr);
        System.out.println("Given date time: " + dateTime);

        // 3-hours ago
        DateTime threeHoursAgo = dateTime.minusHours(3);
        System.out.println("Three hours ago: " + threeHoursAgo);
    }
}
Given date time: 2020-10-20T13:00:00.000-05:00
Three hours ago: 2020-10-20T10:00:00.000-05:00
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        String dateTimeStr = "2020-10-20T13:00:00-05:00";
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT-5"));
        Date date = sdf.parse(dateTimeStr);
        System.out.println("Given date time: " + sdf.format(date));

        // 3-hours ago
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR, -3);
        System.out.println("Three hours ago: " + sdf.format(calendar.getTime()));
    }
}
Given date time: 2020-10-20T13:00:00-05:00
Three hours ago: 2020-10-20T10:00:00-05:00

建议:java.util的日期时间API及其格式化API
SimpleDateFormat
已经过时且容易出错。我建议您完全停止使用它们,转而使用。

您有点像在一个问题中问了两个问题:(1)如何将字符串解析为
OffsetDateTime
(或其他日期时间类型,但
OffsetDateTime
将是正确的现代选择)。(2) 如何从
OffsetDateTime
中减去给定的小时数。这两个问题的答案都很简单。请搜索。(Joda Time
DateTime
将是一个日期选项,但在其他方面也正确且简单。)