您的位置:首页 > 编程语言 > Java开发

Java按照某一时区格式化时间

2015-11-28 14:52 549 查看
好久没写博客,下边先说下笔者写这篇博客的目的吧,前段时间做了一个周期性定时开关机的模块,关机和开机是独立运行的,做这块遇到了好多问题,所以在这和大家分享一下。

关机思路:听到定时关机第一反应就是他是一个定时任务,需要AlarmManager来完成,于是笔者就开始垒代码,完事之后发现设置的AlarmManager在设备重启之后给设定的定时任务将不复存在,笔者一怒之下就,写了一个service,在这个service的onStartCommand方法中笔者写了一个定时器,这个定时器50秒会执行一次,在定时器的run方法里边new了一个线程,线程里边获取当前的系统时间和activity中用户设置的时间去做对比,如果时间到了则执行关机。(只是一个大概的思路)

开机思路:android定时开机的实现真不简单,首先需要了解RTC时钟的概念,要懂C 要懂android的底层和framework以及JNI和调用和ubantu编译android源码,于是乎作者先写了个定时开机的demo,获取RTC时间这个ok,设置RTC时间这个也ok,设置RTC开机闹钟这个也ok,不过后来在工程调用中笔者发现RTC时间永远都是按照00时区去配置的,而系统时间会根据所在时区的变化而变化的。接下来笔者就写了个根据所提供时间算出00时区的时间的方法:

//声明一天时间的总毫秒数
long onDay = 1000 * 60 * 60 * 24L;
//声明天数的间隔
int weekDay = 1;
//获取当前系统时间的毫秒数
long cuttTime = System.currentTimeMillis();
//获取间隔天数的毫秒数
long targetTime = cuttTime + onDay * weekDay;

try {
//声明format对象
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//将几天后的现在时间   格式化
String openDate = f.format(new Date(targetTime));
//打印格式化后的时间
System.out.println(openDate);
//将字符串转转换成Date类型
Date d = (Date) f.parseObject(openDate);
//声明时区为00时区
int timeZoneOffset = 0;
//声明时区对象
TimeZone timeZone;
//返回一个包含符合条件的时区ID的字符串数组
String[] ids = TimeZone.getAvailableIDs(timeZoneOffset * 60 * 60 * 1000);
//如果时区编号的长度等于0
if (ids.length == 0) {
//获取默认时区
timeZone = TimeZone.getDefault();
} else {
//设置ids中返回的时区
timeZone = new SimpleTimeZone(timeZoneOffset * 60 * 60 * 1000,ids[0]);
}
//给format对象设置时区
f.setTimeZone(timeZone);
//格式化date
f.format(d);
//打印按照新时区格式化后的时间
System.out.println(f.format(d));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

输出结果:2015-11-29 15:59:05
输出结果:2015-11-29 07:59:05
这样就讲时间格式化为00时区的格式显示了,之后通过监听android的关机广播去配置用户设置的时间就ok了,当然用户非法关机是收不到关机广播的。


[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: