Android Calendar使用过程中遇到的问题
16lz
2021-01-23
最近项目里使用到了日历(Calendar),这里模拟一个需求,将遇到的问题进行记录。
需求:根据日历时间进行货品预订,并且只能预订未来一个月内的货品
代码实现
- java
package com.pan.calendarsample;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.CalendarView;import java.net.URL;import java.net.URLConnection;import java.util.Calendar;import java.util.Date;public class MainActivity extends AppCompatActivity { private CalendarView calendarView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); calendarView = (CalendarView) findViewById(R.id.calendarView); initCalendar(); } private void initCalendar() { new Thread(new Runnable() { @Override public void run() { URL url = null; try { // 获取网络时间,这里获取淘宝的时间 url = new URL("http://www.taobao.com"); URLConnection uc = url.openConnection(); final long networkTime = uc.getDate(); runOnUiThread(new Runnable() { @Override public void run() { // 预订起始日期 calendarView.setMinDate(networkTime); Calendar calendar = Calendar.getInstance(); Date date = new Date(networkTime); calendar.setTime(date); // 预订结束日期 calendar.add(Calendar.DATE, 30); calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); long lateTime = calendar.getTimeInMillis(); calendarView.setMaxDate(lateTime); } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }}
- xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.pan.calendarsample.MainActivity"> <CalendarView android:id="@+id/calendarView" android:layout_width="match_parent" android:layout_height="match_parent" />RelativeLayout>
- 效果图
问题
本地时间和网络时间
作为一个严谨的项目,千万不能使用本地时间,当用户改动本地时间的时候,项目中的时间也跟着一起变动,这会出现很多问题,比如说,预订多年之前或者之后的货品。这种情况是不允许出现的。所以获取网络时间就很有必要了。可以看这篇博文:获取网络时间设置日期范围
使用Calendar的方法add()进行日期范围设置
说明:在设置最大选取日期时,发现最后一个日期是黑色可选状态(如上图),但是却无法选中。
最后在这里找到答案。
原因:个人猜测,造成这个问题的原因,类似正则表达式中的包含头不包含尾[}。
解决问题的核心代码:
设置在时间区间内的时间,这里减少了1秒calendar.set(Calendar.HOUR_OF_DAY, 23);calendar.set(Calendar.MINUTE, 59);calendar.set(Calendar.SECOND, 59);
作的时候发现的坑:
问题解决后,发现只是减少1秒就可以解决这个问题了,那我换其他方法试试,然后就有了下面的代码Calendar calendar = Calendar.getInstance();Date date = new Date(networkTime);calendar.setTime(date);// 设置当天日期calendar.add(Calendar.DATE, 30);// 增加30天的预订时间long endTime = calendar.getTimeInMillis();calendar.setTimeInMillis(endTime - 5*1000);calendarView.setMaxDate(endTime);
增加30天后,直接减去5秒钟,这样应该就能解决之前的问题了吧。
后来发现最后一天有时候能选择,有时候不能选择。
这里直接做原因说明:在初始化界面后的5秒内,可以选择,但是Calendar还是在计时的,5秒过后就不能选择了。这个原因真的很奇葩。同步网络时间后改动本地时间
在按照最上面给出的代码后,时间范围终于不再受本地时间的影响,正当要松口气的时候,突然发现当天的日期竟然没有被选中。
后来发现是之前本地修改的时间没有修改回来,本地时间还是对程序存在影响。不过,这里只影响当天日期的标示,对预订的时间范围没有影响。
最后问了很多的朋友,目前还没发现解决办法,不知道各位有没有遇到类型情况,还请不吝赐教。
更多相关文章
- DatePicker 日期选择控件 DatePickerDialog 日期选择对话框
- android 日期对话框
- android获得系统时间(Handler)
- Android 时间滚轴
- ch07 Android 日期与时间对话框
- Android TimeLine 时间节点轴的实现
- Android时间工具类 本地转UTC,UTC转本地