Date 日期时间 浅层研究

2023-11-13

Date 日期时间 浅层研究

若需查看所有函数及属性常量,请直接翻至尾部

获取当前时间の奇怪玩法

Date

new Date().getTime(); //获取当前时间
/**
 *@desc 无参构造器调用 System.currentTimeMillis() 传递给有参构造器
 *@source java.util.Date.class
 */

 public Date() {
     this(System.currentTimeMillis());
 }

 public Date(long date) {
     fastTime = date;
 }

 public long getTime() {
     return getTimeImpl();
 }

 private final long getTimeImpl() {
     if (cdate != null && !cdate.isNormalized()) {
         normalize(); // 处理时间
     }
     return fastTime;
 }

System

 public static native long currentTimeMillis(); // 获取当前毫秒(ms)级时间 (返回从1970年1月1日到现在的总毫秒数)
 
  /*
    Returns the current time in milliseconds. Note that while the unit of time of the return value is a millisecond, the      		granularity of the value depends on the underlying operating system and may be larger. For example, many operating systems
    measure time in units of tens of milliseconds.
   
   	* 此方法调用时需先切换至系统层执行代码再切换回JVM处理数值,其效率虽大于Java其他封装方法,但在高频率高并发的调用情况下,性能大打折扣。
    · 此方法返回的时间受操作系统环境影响
    	· 比如在Windows上 System.currentTimeMillis()方法并不能提供1ms的计时粒度,它的粒度为15~16ms
    	· 想要获取更精确的时间可以采用 nanoTime()
  */


 public static native long nanoTime(); // 返回当前纳米级(ns)时间值

[^native 原生态方法 使用本地语言实现的功能。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。]:

Calendar

Calendar.getInstance().getTimeInMillis();
/**
 *@desc 可以根据系统用户环境获取更准确的 一般时间,但其调用封装过于复杂 效率低,不适合频繁调用或用于精准时间计算
 *@source java.util.Calendar
 */

    public long getTimeInMillis() {
            if (!isTimeSet) {
                updateTime();
            }
            return time;
        }

    public static Calendar getInstance() //获取日历类实例对象
    {
        return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT)); //根据系统时区创建
    }

奇怪的问题探究区

在空余之时 我做了个测试,发现200次以内 调用 getTimeInMillis() 的时间消耗远小于 200次后,将for循环拆成两份分别累计时间时发现第二次效率明显低于第一次

更有趣的是,单独调用它尽然要比使用 封装类Date的getTime()效率还低

  • 查询资料: http://pzemtsov.github.io/2017/07/23/the-slow-currenttimemillis.html

    查看此资料之前我们需要了解下 native 方法如何实现的与 java 交互

  • SUN公司发布的Java 本地接口(JNI)提供了将Java与C/C++、汇编等本地代码集成的方案,该规范使得在 Java 虚拟机内运行的 Java 代码能够与其它编程语言互相操作,包括创建本地方法、更新Java对象、调用Java方法,引用 Java类,捕捉和抛出异常等,也允许 Java代码调用 C/C++或汇编语言编写的程序和库。

    JNI 对应数据类型关系如下表:

    Java 类型 本地 C 类型 实际表示的 C 类型(Win32) 说明
    boolean jboolean unsigned char 无符号,8 位
    byte jbyte signed char 有符号,8 位
    char jchar unsigned short 无符号,16 位
    short jshort short 有符号,16 位
    int jint long 有符号,32 位
    long jlong __int64 有符号,64 位
    float jfloat float 32 位
    double jdouble double 64 位
    void void N/A N/A
  • //OpenJDK hotspot/src/os/windows/vm/jvm.cpp/os_windows.cpp
    
    jlong os::javaTimeMillis() {
      if (UseFakeTimers) {
        return fake_time++;
      } else {
        FILETIME wt;
        GetSystemTimeAsFileTime(&wt);
        return windows_to_java_time(wt);
      }
    }
    
    jlong windows_to_java_time(FILETIME wt) {
      jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
      return (a - offset()) / 10000;
    }
    
    static jlong  _offset   = 116444736000000000;
    
    jlong offset() {
      return _offset;
    }
    

    Windows 时间获取基于GetSystemTimeAsFileTime(),返回一个FILETIME。这种结构可以追溯到32位系统,由两个32位字段 dwHighDateTime和组成dwLowDateTime,它们组合在一起,定义了从新纪元以来的100位纳秒间隔的64位数字(long)

    经过资料反馈,Linux封装的方法效率还要低于Windows

  • 解决方案 一: https://www.jianshu.com/p/d2039190b1cb

  • 解决方案 二: https://www.cnblogs.com/ppgeneve/p/9351788.html

Date的方法

序号 方法和描述
1 boolean after(Date date) 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。
2 boolean before(Date date) 若当调用此方法的Date对象在指定日期之前返回true,否则返回false。
3 Object clone( ) 返回此对象的副本。
4 int compareTo(Date date) 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。
5 int compareTo(Object obj) 若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException。
6 boolean equals(Object date) 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。
7 long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
8 int hashCode( ) 返回此对象的哈希码值。
9 void setTime(long time) 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。
10 String toString( ) 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

Date的格式化编码

时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母

定义如下:

字母 描述 示例
G 纪元标记 AD
y 四位年份 2001
M 月份 July or 07
d 一个月的日期 10
h A.M./P.M. (1~12)格式小时 12
H 一天中的小时 (0~23) 22
m 分钟数 30
s 秒数 55
S 毫秒数 234
E 星期几 Tuesday
D 一年中的日子 360
F 一个月中第几周的周几 2 (second Wed. in July)
w 一年中第几周 40
W 一个月中第几周 1
a A.M./P.M. 标记 PM
k 一天中的小时(1~24) 24
K A.M./P.M. (0~11)格式小时 10
z 时区 Eastern Standard Time
文字定界符 Delimiter
" 单引号 `

使用 SimpleDateFormat 格式化日期

SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。

import  java.util.*;
import java.text.*;
 
public class DateDemo {
   public static void main(String args[]) {
 
      Date dNow = new Date( );
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
 
      System.out.println("当前时间为: " + ft.format(dNow));
   }
}

输出结果

Current Date: Wed 2016.11.09 at 08:23:19 AM UTC

使用printf格式化日期

printf 方法可以很轻松地格式化时间和日期。使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾。

转 换 符 说 明 示 例
c 包括全部日期和时间信息 星期六 十月 27 14:21:20 CST 2007
F "年-月-日"格式 2007-10-27
D "月/日/年"格式 10/27/07
r "HH:MM:SS PM"格式(12时制) 02:25:51 下午
T "HH:MM:SS"格式(24时制) 14:28:16
R "HH:MM"格式(24时制) 14:28

实例:

import java.util.Date;
 
public class DateDemo {
 
  public static void main(String args[]) {
     // 初始化 Date 对象
     Date date = new Date();
 
     //c的使用  
    System.out.printf("全部日期和时间信息:%tc%n",date);          
    //f的使用  
    System.out.printf("年-月-日格式:%tF%n",date);  
    //d的使用  
    System.out.printf("月/日/年格式:%tD%n",date);  
    //r的使用  
    System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date);  
    //t的使用  
    System.out.printf("HH:MM:SS格式(24时制):%tT%n",date);  
    //R的使用  
    System.out.printf("HH:MM格式(24时制):%tR",date);  
  }
}

以上实例编译运行结果如下:

全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012  
年-月-日格式:2012-09-10  
月/日/年格式:09/10/12  
HH:MM:SS PM格式(12时制):10:43:36 上午  
HH:MM:SS格式(24时制):10:43:36  
HH:MM格式(24时制):10:43  

更多例子:https://www.runoob.com/java/java-date-time.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Date 日期时间 浅层研究 的相关文章

  • 高并发高可用(二)架构

    4 大型网站架构模式 模式词汇来源于建筑学 定义 每个模式描述一个在我们周围不断重复发生发生的问题及该问题解决方案的核心 这样你就能一次又一次使用该方案而不必做重复的工作 为解决大型网站所遇到的高并发访问 海量数据处理 高可用运行等系列问题
  • MySQL的预读机制

    一 预读机制 InnoDB在I O的优化上有个比较重要的特性为预读 预读请求是一个i o请求 它会异步地在缓冲池中预先回迁多个页面 预计很快就会需要这些页面 这些请求在一个范围内引入所有页面 InnoDB以64个page为一个extent
  • 网上书店管理系统 课程设计

    数据库原理及应用 综合设计报告 第一章 绪论 随着计算机技术的发展以及计算机网络的逐渐普及 因特网成为了人们查找信息的重要场所 二十一世纪是信息的时代 所以信息的交换和信息的流通就显得特别的重要 因此网上书店的出现成为必然 实体书店在正常运
  • pytorch 入门 DenseNet

    知识点0 dense block的结构 知识点1 定义dense block 知识点2 定义DenseNet的主体 知识点3 add module 知识点 densenet是由 多个这种结构串联而成的 import torch import
  • Retrofit2 使用@Multipart上传文件

    1 上传单个文件 1 1定义接口 Multipart POST uploadImgs Call
  • Laravel5.6 实现小程序使用openid登陆、手机号验证码登陆、账户密码登陆三种登陆方式

    我的个人博客 逐步前行STEP 目前开发小程序 按需求要实现3种登陆方式 1 微信授权登陆 2 账户密码登陆 3 手机号 验证码登陆 我使用laravel自带的Auth认证机制 通过attempt方法进行账户验证 但是默认的认证机制必须包含
  • YOLOv6网络结构详解

    网络结构 根据官方代码使用Drawio绘制的YOLOv6 s网络结构图 官方资源 美团技术团队对于YOLOv6的介绍 文章 文章 文章 论文地址 YOLOv6 A Single Stage Object Detection Framewor
  • Java基础——大杂烩

    今天阿Q给大家来一节大杂烩 讲一下专题性不强的java基础知识 main方法详解 public static void main String args 这里面只有args能改变 public 被jvm调用 访问权限足够大 static 被
  • 记一次结构体字节对齐引起的严重问题

    头文件自定义了bool类型 4个字节 ifndef bool define bool int define true 1 define false 0 endif typedef struct bool automaticActivatio
  • 微信小程序消息订阅的实现——后端是nodejs的koa框架

    在做毕设中 我遇到这么一个使用场景 当顾客购买某个商家的商品后 那这个商家应该要收到通知信息 提示你家商品被购买了 故有了以下代码 微信小程序js代码 onSubmit function 用户点击确认支付 用户应该点击允许 同意提醒信息订阅
  • window 7 平台上 MXNET 源码编译

    目的 本文主要描述怎么在windows上编译mxnet源码 得到可用的libmxnet dll和libmxnet lib文件 版本 mxnet x64 release CPU版 运行环境 windows 7 64bit visual stu
  • [风格迁移系列五: WaveCT-AIN] 医学图像的风格迁移和跨域自适应(泛化性)

    不同于自然图像的风格迁移 在临床应用上 医学图像更加注重图像生成的纹理细节 并且需要实时的推理速度 因此提出一个实时且高质量的风格迁移方法非常重要 这篇论文实现了这个方法 Remove Appearance Shift for Ultras
  • Rectangle矩形类

    题目 设计一个名为Rectangle的矩形类 并实现Comparable接口 这个类包括 1 两个名为width和height的double数据域 它们分别表示矩形的宽和高 2 Rectangle的无参构造方法 width和height的默
  • Transactions on Multimedia 投稿经验分享

    关于IEEE Transactions on Multimedia 投稿经验分享 SCI分区 JCR分区 Q1 Q1 影响因子 7 3 期刊官方网站 IEEE Transactions on Multimedia IEEE Xplore 投
  • 聚类分析:原型K-Means/K-Means++聚类、层次聚类;密度聚类DBSCAN

    聚类分析 处理无标签数据 from IPython display import Image matplotlib inline 1 使用K Means方法按照相似度对对象进行分组 1 1使用sklearn实现K Means聚类 from
  • rdp协议解读

    转自 http blog csdn net jiangtao killer article details 6940346 一 前言 RDP 远程显示协议 Remote Display Protocol 简称RDP 提供了客户和服务器之间的
  • 微博爬取多页评论

    最近在学习爬虫 爬取了第一页后 信心满满 但是翻不了页 就卡住了 搜了好多资料 b站都翻烂了 还是没找到合适的代码 最后在知乎找到了 2023微博评论爬虫 用python爬上千条微博评论 突破15页限制 知乎 zhihu com 这篇文章干
  • Linux之系统进程及控制

    一 什么是进程 进程就是系统未完成并且正在进行的工作 二 查看系统进程 1 图形方式查看 gnome system monitor 图示 2 进程查看命令 ps A 所有进程 a 在当前环境中运行的进程 不包含环境信息 u 显示进程用户信息
  • Win7下硬盘安装Linux双系统

    参考如下两篇文章 基本能搞清楚如何安装 1 Win7下硬盘安装Linux双系统 Win7下硬盘安装CentOS6 2 http www 3fwork com b902 002405MYM032666 2 Windows7硬盘安装Fedora
  • 【思维导图】python常见的异常(error) 汇总

    点开看大图 python常见的异常 error 汇总 name error o尝试访问一个没有申明的变量 oNameError name xrange is not defined 原因 在Python 3中 range 与xrange 合

随机推荐

  • wchar_t 、UTF-8、UTF-16的转换方法

    继续编码转换 Unicode 有两套编码集 UCS 2 和 UCS 4 Windows 的内部其实是用的 UCS 2 标准 并用 UTF 16 来实现 而非 Windows 系统大多采用了 UTF 8 实现 大家都知道在windows上wc
  • ZBrush怎样自动保存

    在使用 ZBrush执行任何会话期间 您都可以设置将文件自动保存 并可以修改保存时间间隔 文件保存位置等设置 发生系统错误后要重新启动ZBrush 时 可以从临时文件夹或指定的文件夹中恢复备份文件 如果您选择不恢复备份文件 退出应用程序后文
  • Scala基础快速学习笔记

    Scala Java语言脚本化 面向函数 直奔主题 直接写程序 直接运行即可 进入Scala shell gt bin scala scala gt help 查看帮助 o getClass classOf res6 inter 类型推断
  • 如何在虚拟环境(虚幻引擎)按照规划路径下拍摄图片并应用于三维重建,以及路径规划

    如何在虚拟环境 虚幻引擎 按照规划路径下拍摄图片并应用于三维重建 在三维重建工作中针对各项路径规划算法的使用 如果完全依照现实生活的照片未免太过奢侈和艰难 若用无人机 各项准备工作繁琐 所以我们改为在虚拟环境下使用我们设定的相机位姿来进行拍
  • Git 合并不同来源的分支 【rebase】

    Git 合并不同来源的分支 rebase 背景介绍 操作命令 背景介绍 我现在有2个流程 AAA BBB 想要把这2个不同来源的分支 合并到一起 操作命令 下载dev分支 lt 分支名 gt
  • 如何取得字符串最后一个字符

    方法一 include
  • 嵌入式基础知识-DMA

    本篇来介绍DMA的一些基础知识 1 DMA简介 DMA Direct Memory Access 中文名为直接内存访问 它是一些计算机总线架构提供的功能 能使数据从附加设备 如磁盘驱动器 直接发送到计算机主板的内存上 对应嵌入式处理器来说
  • 【研究开源机器臂】(3):低成本实现200多元实现,开源机械臂,使用Wemos D1 R32 ESP32 +Arduino CNC,可以控制机械臂往复运动了,有视频介绍和演示说明

    开源机械臂资料 文章分类 https blog csdn net freewebsys category 5782941 html 前面讨论了相关的技术调研 1 首先是设备购买机械臂 170 180 左右 大家可以去小黄鱼去找找 或者这样的
  • 问题 2020-6-10

    MySQL查考数据表中某一列是否有重复数据 解决 MySQL中 查询表 dat bill 2018 11 中字段 product id 值重复的记录 SELECT product id COUNT AS sumCount FROM dat
  • VUE中替换指定字符

    例子 我想要将变量a中的clazz替换成user 原本a的值为sys clazz 但是通过跳转到另一个页面时我需要把clazz替换成user 因此我可以这样做 this a this route query academicYearTabl
  • pip&conda 搜索包

    1 pip搜索包 pip search已经停用 需要安装pip search包 gt pip install pip search gt pip search numpy https pypi org search q numpy
  • 构造方法私有化

    1 单例设计模式 Singleton 在正常情况下 如果有一个类 那么只有通过产生对象之后才可以操作这个类范例 观察如下代码 class Singleton public void print System out println Hell
  • Web3的未来:7 个潜在的亿级机会

    Web3的未来将不仅仅是PFP的jpegs NFT市场 CEXs DEXs和DeFi协议 为了使Web3成为主流 有许多工具可以围绕一个繁荣的生态系统来构建 这里有7个隐藏的web3亿美元的机会 当下就开始建设 1 钱包整合生态系统 Web
  • 随机生User-Agent代理Ip

    import random import urllib request def url url p 49 235 246 24 8118 proxy support urllib request ProxyHandler http p op
  • opencv2 无法加载RTSP的问题

    最近通过OPENCV3 2 0加载海康摄像头 实现后续的摄像头画面拼接 但是发现拷贝了所有的opencv2的dll文件 仍然无法成功加载rtsp视频流 假设是视频流无法获取 通过VLC工具拉流 可以成功 效果如下 后来试了很多其他办法 感觉
  • linux卸载内核

    查看所安装的所有内核 ls boot 在删除旧内核之前 记住最好留有2个最近的内核 最新的和上一个版本 以防主要的版本出错 现在就让我们看看如何在Ubuntu上清理旧内核 在Ubuntu内核镜像包含了以下的包 linux image 内核镜
  • 【python实现华为OD机试真题】优雅子数组【2023 Q1

    题目描述 如果一个数组Q中出现次数最多的元素出现大于等于K次 被称为k 优雅数组 k也可以被称为优雅阈值只 例如 数组1 2 3 1 2 3 1 它是一个3 优雅数组 因为元素1出现次数大于等于3次 数组 1 2 3 1 2 就不是一一个3
  • UE4 跑酷游戏-得分机制

    得分机制 1 这次我们要做的是得分 根据人物跑过的地板来得取分数 首先进入我们的第三人称游戏模式里面 创建一些变量 2 退出第三人称游戏模式后 进入主地板蓝图后 在销毁地板之前写读取人物跑i过地板块数进行得分
  • Unity 使用Photon Server 联网开发(一)配置连接设置流程

    Photon官网首页 Photon官网 下载配置Pun与Server的教程 Photon Pun与Server的下载与配置教程 1 Pun导入项目后配置PhotonServerSettings Hosting 服务器托管方式 Not Set
  • Date 日期时间 浅层研究

    Date 日期时间 浅层研究 若需查看所有函数及属性常量 请直接翻至尾部 文章目录 Date 日期时间 浅层研究 获取当前时间 奇怪玩法 Date System Calendar 奇怪的问题探究区 查看此资料之前我们需要了解下 native