最近项目里使用到了日历(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>
  • 效果图
    Android Calendar使用过程中遇到的问题_第1张图片

问题

  1. 本地时间和网络时间
    作为一个严谨的项目,千万不能使用本地时间,当用户改动本地时间的时候,项目中的时间也跟着一起变动,这会出现很多问题,比如说,预订多年之前或者之后的货品。这种情况是不允许出现的。所以获取网络时间就很有必要了。可以看这篇博文:获取网络时间

  2. 设置日期范围
    使用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秒过后就不能选择了。这个原因真的很奇葩。

  3. 同步网络时间后改动本地时间
    在按照最上面给出的代码后,时间范围终于不再受本地时间的影响,正当要松口气的时候,突然发现当天的日期竟然没有被选中。
    后来发现是之前本地修改的时间没有修改回来,本地时间还是对程序存在影响。不过,这里只影响当天日期的标示,对预订的时间范围没有影响。

最后问了很多的朋友,目前还没发现解决办法,不知道各位有没有遇到类型情况,还请不吝赐教。

更多相关文章

  1. DatePicker 日期选择控件 DatePickerDialog 日期选择对话框
  2. android 日期对话框
  3. android获得系统时间(Handler)
  4. Android 时间滚轴
  5. ch07 Android 日期与时间对话框
  6. Android TimeLine 时间节点轴的实现
  7. Android时间工具类 本地转UTC,UTC转本地

随机推荐

  1. Android(安卓)监听home键(android:launchM
  2. Android超链接去下划线--Android学习笔记
  3. Android(安卓)技术用于汇总
  4. Android(安卓)Edittext焦点处理;
  5. moodle手机版在android平台上的安装配置
  6. 在Eclipse中导入android sdk源码
  7. Android教程之Android(安卓)SDK1.5模拟器
  8. Android(安卓)Studio 更新问题
  9. 图解Android(安卓)- Android(安卓)GUI 系
  10. 安装Android时Could not find D:\Androi