记一次使用SimpleDateFormat 格式化时间时遇到的问题

本文分享了在使用SimpleDateFormat类获取当前时间时遇到的兼容性问题,即API level24及以上才能使用的情况。通过对比两个相似的包,指出了问题所在,并提供了正确的导入方式,避免新手开发者陷入同样的困扰。

网上的使用方法一大堆,我就不再介绍了,就写一下自己遇到的问题.

先来实现一下获取当前时间:

SimpleDateFormat simpleDateFormat =new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
String nowTime=simpleDateFormat .format(new Date());

 一般来说这样写是没有问题的,但是我遇到了以下问题:

这个类的使用竟然要 API level 24及以上才能使用,上网查询之后发现网上的写法与此并没有两样,这令我很费解。

在询问过身边的大佬之后,知道了问题所在,原因在于 使用SimpleDateFormat 类进行导包的时候有两个选项,我选择的那个并不是

Java语法中的那个包.虽然他们看起来一模一样,类名,方法名,以及使用方法都是一样的.

所以解决方案是:

导包的时候选择 Java的包,也就是下面的方式(有无首字母大写忘记了)

import Java.text.SimpleDateFormat

转载于:https://www.cnblogs.com/LiuDanK/p/9959586.html

<think>好的,我现在需要帮助用户了解如何使用Servlet和Cookie录用户访问次数并动态更新计数器。首先,我得回忆一下Servlet和Cookie的基本知识。根据用户提供的引用内容,Servlet是运行在服务器端的Java程序,处理HTTP请求,而Cookie是服务器存储在客户端的一小段信息,用于跟踪用户状态。 用户的问题具体是如何录访问次数,并在每次访问更新计数器。我需要分步骤来设计解决方案。首先,当用户第一次访问,服务器会创建一个新的Cookie,设置访问次数为1。如果用户再次访问,Servlet需要读取现有的Cookie,将次数加1,然后更新Cookie的值。 接下来要考虑的是Cookie的读写流程。处理HTTP请求,Servlet可以通过HttpServletRequest对象的getCookies()方法获取客户端传来的所有Cookie。然后遍历这些Cookie,查找是否有名为“visitCount”的Cookie。如果存在,就取出其值,转换为整数,加1后更新;如果不存在,就新建一个Cookie,并将值设为1。 然后需要考虑的是Cookie的有效期。为了让Cookie在浏览器关闭后仍然保留一段时间,可能需要设置其最大存活时间(maxAge),比如设置为一年(60秒*60分*24小*365天)。不过根据用户的需求,是否需要持久化到磁盘还是仅会话期间有效?用户可能希望即使关闭浏览器再打开,访问次数也能累计,所以设置较长的maxAge是合理的。 另外,每次更新Cookie后,必须通过HttpServletResponse的addCookie方法将修改后的Cookie发送回客户端,否则客户端不会保存变更。 还需要注意异常处理,比如Cookie的值可能被篡改或无法转换为整数,这候应该如何处理。例如,捕获NumberFormatException,并重置计数器为1,或者忽略异常情况,保证程序的健壮性。 代码结构方面,用户提供的引用中有示例的Servlet结构,可以参考。比如,在doGet方法中处理请求,获取Cookie数组,遍历查找目标Cookie,然后进行相应的处理。最后将结果写入响应,比如显示访问次数和上次访问时间。 用户可能还希望显示上次访问的时间,这可以通过另一个Cookie来录。每次访问,除了更新访问次数,还要将当前时间保存到另一个Cookie中,比如“lastVisit”。 现在,把这些思路整理成具体的步骤: 1. 在Servlet的doGet方法中,获取请求中的所有Cookie。 2. 遍历Cookie数组,查找“visitCount”和“lastVisit”。 3. 如果找到“visitCount”,解析其值为整数,加1;否则设为1。 4. 更新或创建“visitCount”Cookie,设置maxAge。 5. 同样处理“lastVisit”Cookie,录当前时间。 6. 将更新后的Cookie添加到响应中。 7. 生成响应页面,显示访问次数和上次访问时间。 在代码实现,需要注意Cookie的路径设置,可能需要设置为根路径(/)以便在整个应用内有效。此外,处理时间,要格式化为合适的字符串,比如使用SimpleDateFormat。 现在,检查是否有遗漏的部分。例如,如何处理首次访问没有Cookie的情况,是否正确地初始化计数器。另外,中文字符编码的问题,可能需要设置响应的contentType为UTF-8,避免乱码。 最后,将整个流程用代码示例展示出来,并解释关键步骤。确保代码中的注释清晰,并符合用户提供的引用中的示例结构,比如使用@WebServlet注解,继承HttpServlet类等。 可能还需要考虑并发情况,但Servlet本身是线程安全的吗?实际上,每个请求在单独的线程中处理,但实例变量可能引发线程安全问题。不过在这个例子中,所有数据都存储在Cookie中,属于客户端状态,因此不会存在服务端的并发问题。 总结步骤,编写代码示例,并解释每个部分的作用。同,提醒用户注意Cookie的安全性问题,比如HttpOnly和Secure标志,但用户的问题中没有提到这些,可能在回答中不需要深入讨论,除非用户特别要求。 最后,生成相关问题,帮助用户进一步学习,比如如何处理Cookie的过期时间,或者使用Session替代Cookie的优缺点等。</think>### 分步实现Servlet录用户访问次数 #### 1. 创建Servlet类并重写doGet方法 ```java @WebServlet("/VisitCounter") public class VisitCounterServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); // 获取所有Cookie Cookie[] cookies = request.getCookies(); int visitCount = 1; String lastVisitTime = "首次访问"; // 遍历查找现有Cookie if (cookies != null) { for (Cookie cookie : cookies) { if ("visitCount".equals(cookie.getName())) { try { visitCount = Integer.parseInt(cookie.getValue()) + 1; } catch (NumberFormatException e) { visitCount = 1; // 无效值重置计数器 } } if ("lastVisit".equals(cookie.getName())) { lastVisitTime = cookie.getValue(); } } } // 更新或创建Cookie Cookie countCookie = new Cookie("visitCount", String.valueOf(visitCount)); Cookie timeCookie = new Cookie("lastVisit", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // 设置Cookie有效期(1年) countCookie.setMaxAge(60*60*24*365); timeCookie.setMaxAge(60*60*24*365); // 设置路径为根目录 countCookie.setPath("/"); timeCookie.setPath("/"); // 添加Cookie到响应头 response.addCookie(countCookie); response.addCookie(timeCookie); // 生成响应页面 out.println("<h3>访问统计</h3>"); out.println("<p>访问次数: " + visitCount + "</p>"); out.println("<p>上次访问时间: " + lastVisitTime + "</p>"); } } ``` #### 2. 关键步骤说明 1. **Cookie获取**:通过`request.getCookies()`获取客户端发送的所有Cookie 2. **Cookie解析**: - 遍历Cookie数组查找`visitCount`和`lastVisit` - 遇到数值转换异常重置计数器,保证健壮性 3. **Cookie更新**: - 创建新Cookie对象自动覆盖同名Cookie - 设置`setMaxAge(31536000)`使Cookie保留1年 - `setPath("/")`确保整个网站可读取Cookie 4. **时间处理**:使用`SimpleDateFormat`格式化当前时间 5. **响应输出**:通过HTML展示统计信息 #### 3. 访问验证 1. 首次访问显示: ``` 访问次数: 1 上次访问时间: 首次访问 ``` 2. 第二次访问显示: ``` 访问次数: 2 上次访问时间: 2023-08-10 14:30:45 ``` #### 4. 注意事项 1. **Cookie大小限制**:单个Cookie建议不超过4KB 2. **隐私设置**:浏览器可能禁用Cookie,需做降级处理 3. **时间同步**:依赖客户端系统时间准确性 4. **安全增强**:可添加`cookie.setHttpOnly(true)`防止XSS攻击[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值