joda-time

在工作中经常会碰到需要对时间进行处理的情况。SimpleDateFormat被大量使用于处理时间格式化过程,由于时间转换过程遇到的多线程并发的使用场景并不多见,所以很难发现在该类的隐患,事实上,该类并非是线程安全的,在多线程使用format()和parse()方法时可能会遇到问题。也就是说,使用同一个SimpleDateFormat实例,开若干线程做日期转换操作,得到的结果可能并不准确。在这种背景下, 我们在大数据分析等多种高并发场景下, 应该寻找一个线程安全的替代品——Joda-time。

https://github.com/JodaOrg/joda-time

时间转换在线工具

添加依赖

implementation 'joda-time:joda-time:2.10.14'

DateTime:这是最常用的一个类。它以毫秒级的精度封装时间上的某个瞬间时刻

在这里插入图片描述

更具自己需求操作,下面我粘出我项目中用到的和一些简单操作
一些常用操作:

//当前系统所在时区的当前时间,精确到毫秒
DateTime dt = new DateTime()

//它表示这个时间戳距1970-01-01T00:00:00Z的毫秒数。使用默认的时区
DateTime dt = new DateTime(new Date())

//构造一个指定的时间,这里精确到秒,类似地其它构造方法也可以传入毫秒
DateTime dt = new DateTime(2019, 12, 18, 17, 23, 51, 501)

int year = dt.getYear();// 年
int month = dt.getMonthOfYear();// 月
int day = dt.getDayOfMonth();// 日
int hour = dt.getHourOfDay();// 小时
int minute = dt.getMinuteOfHour();// 分钟
int second = dt.getSecondOfMinute();// 秒
int millis = dt.getMillisOfSecond();// 毫秒

//格式化时间
DateTime dateTime = new DateTime();
String s1 = dateTime.toString("yyyy/MM/dd hh:mm:ss.SSSa");
String s2 = dateTime.toString("yyyy-MM-dd HH:mm:ss");
String s3 = dateTime.toString("EEEE dd MMMM, yyyy HH:mm:ssa");
String s4 = dateTime.toString("yyyy/MM/dd HH:mm ZZZZ");
String s5 = dateTime.toString("yyyy/MM/dd HH:mm Z");
//time标识毫秒数(间隔时间戳); 以下毫秒折合日、时依次类推
Interval(0, time).toPeriod().days
/**
 * 86400000毫秒 转化成 01天00小时00分00秒格式
 * 将一个时间间隔时间戳 格式化成DD DD天HH小时mm分ss秒格式
 * minimumPrintedDigits(2) 数字必须展示两位 
 * appendSeparator 分割符 ; appendSuffix 后缀
 * @return String
 */
fun Long.formatDDHHMMssToString(): String {
    val fmt = PeriodFormatterBuilder()
        .printZeroAlways()
        .minimumPrintedDigits(2)
        .appendDays()
        .appendSuffix("天")
        .printZeroAlways()
        .minimumPrintedDigits(2)
        .appendHours()
        .appendSuffix("小时")
        .printZeroAlways()
        .minimumPrintedDigits(2)
        .appendMinutes()
        .appendSuffix("分")
        .printZeroAlways()
        .minimumPrintedDigits(2)
        .appendSeconds()
        .appendSuffix("秒")
        .toFormatter()
    return fmt.print(Period(this).normalizedStandard())
}
/**
     * Joda-Time 计算两个时间差(年,月,星期,日,小时,分钟,秒,毫秒)   注: 开始时间 和 结束时间 格式须相同
     * @param startDateTime     开始时间
     * @param endDateTime       结束时间
     * @param dateTimeType      时间格式(2018年01月20日 21:02:37(yyyy年MM月dd日 HH:mm:ss))
     */
    public static void calculateTimeDifference(String startDateTime, String endDateTime, String dateTimeType) {

        DateTimeFormatter format = DateTimeFormat.forPattern(dateTimeType);
        DateTime dateTimeStart = format.parseDateTime(startDateTime);
        DateTime dateTimeEnd = format.parseDateTime(endDateTime);

        if (dateTimeStart.isAfter(dateTimeEnd)) {
            DateTime temp = dateTimeStart;
            dateTimeStart = dateTimeEnd;
            dateTimeEnd = temp;
        }

        Interval interval = new Interval(dateTimeStart.getMillis(), dateTimeEnd.getMillis());
        Period p = interval.toPeriod();
        System.out.println(p.toString());
        System.out.printf("两个日期的时间差:%d 年 %d 个月 %d 星期 %d 天 %d 小时 %d 分钟 %d 秒 %d 毫秒\n",
                p.getYears(), p.getMonths(), p.getWeeks(), p.getDays(), p.getHours(), p.getMinutes(), p.getSeconds(), p.getMillis());

    }
	//使用方式
    public static void main(String[] args) {
        calculateTimeDifference("2018年01月20日 21:02:37", "2019年03月01日 13:24:46", "yyyy年MM月dd日 HH:mm:ss");
        calculateTimeDifference("2018年01月27日", "2019年03月07日", "yyyy年MM月dd日");
        calculateTimeDifference("2019年03月01日", "2018年01月20日", "yyyy年MM月dd日");
    }
    /打印结果
		P1Y1M1W1DT16H22M9S
		两个日期的时间差:1 年 1 个月 1 星期 116 小时 22 分钟 90 毫秒
		P1Y1M1W1D
		两个日期的时间差:1 年 1 个月 1 星期 10 小时 0 分钟 00 毫秒
		P1Y1M1W2D
		两个日期的时间差:1 年 1 个月 1 星期 20 小时 0 分钟 00 毫秒

//20220901 转时间戳
DateTime.parse("20220901", DateTimeFormat.forPattern("yyyyMMdd")).millis

参考网址
https://blog.csdn.net/wjsshhx/article/details/62422844
https://blog.csdn.net/weixin_34185364/article/details/91442797

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄毛火烧雪下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值