实战:求年月日时间前后遇到的坑和解决方式

这里写目录标题

  • 前言
    • 正确实例:
    • 错误实例:
  • 需求

前言

这周接到一个时间转换任务需要处理,本来没什么问题,后来完成后发现时间有偏差,又重写了一遍代码,感觉很有记录必要性,希望看过的小伙伴可以避坑。照例,先说结论。

正确实例:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(CommonConstants.DATE_FORMAT);
LocalDateTime now = LocalDateTime.now();

错误实例:

Calendar calendar = Calendar.getInstance(); 

结果:如果我们使用了错误的工具类Calendar,求出的时间在时分秒中会有偏差,打到几小时,小到十几秒。这个时间的偏差是我们无法忍受的。

需求

这个工作是要求一个接口传输给我们一部分参数,然后根据参数求出对应的数据,比如昨天今天,三小时、天、月、年后等等。下面是代码实例,照例先放正确的,错误的留给大家参考。

//求出年月日小时对应要求的时间
public Intent dateForParams2(Intent intent, String time) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(CommonConstants.DATE_FORMAT);
    LocalDateTime now = LocalDateTime.now();
    String endTime = now.format(formatter);

    // 将时间向前推移1小时
    if (CommonConstants.HeHaiTimeKey.HOUR_1.equals(time)) {
        now = now.minusHours(1);

    }
    if (CommonConstants.HeHaiTimeKey.HOUR_3.equals(time)) {
        now = now.minusHours(3);

    }
    if (CommonConstants.HeHaiTimeKey.HOUR_24.equals(time)) {
        now = now.minusDays(1);
    }
    if (CommonConstants.HeHaiTimeKey.HOUR_48.equals(time)) {
        now = now.minusDays(2);
    }
    if (CommonConstants.HeHaiTimeKey.HOUR_72.equals(time)) {
        now = now.minusDays(3);
    }

    // 将日期向前推移3天
    if (CommonConstants.HeHaiTimeKey.DAY_3.equals(time)) {
        now = LocalDateTime.of(
                now.minusDays(3).toLocalDate(),
                LocalTime.of(8, 0, 0)            // 设置为8点整
        );
    }
    if (CommonConstants.HeHaiTimeKey.DAY_7.equals(time)) {
        now = LocalDateTime.of(
                now.minusDays(7).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
    }
    if (CommonConstants.HeHaiTimeKey.DAY_15.equals(time)) {
        now = LocalDateTime.of(
                now.minusDays(15).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
    }
    if (CommonConstants.HeHaiTimeKey.DAY_30.equals(time)) {
        now = LocalDateTime.of(
                now.minusDays(30).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
    }
    // 将月份向前推移3个月
    if (CommonConstants.HeHaiTimeKey.THREE_MONTH.equals(time)) {
        now = LocalDateTime.of(
                now.minusMonths(3).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
    }
    if (CommonConstants.HeHaiTimeKey.HALF_YEAR.equals(time)) {
        // 将月份向前推移6个月
        now = LocalDateTime.of(
                now.minusMonths(6).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
    }

    // 将年份向前推移1年
    if (CommonConstants.HeHaiTimeKey.ONE_YEAR.equals(time)) {
        now = LocalDateTime.of(
                now.minusYears(1).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
    }
    if (CommonConstants.HeHaiTimeKey.THREE_YEAR.equals(time)) {
        now = LocalDateTime.of(
                now.minusYears(3).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
    }
    if (CommonConstants.HeHaiTimeKey.FIVE_YEAR.equals(time)) {
        now = LocalDateTime.of(
                now.minusYears(5).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
    }
    if (CommonConstants.HeHaiTimeKey.TEN_YEAR.equals(time)) {
        now = LocalDateTime.of(
                now.minusYears(10).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
    }


    //设置早上8点
    if (CommonConstants.HeHaiTimeKey.TODAY.equals(time)) {
        now = LocalDateTime.of(
                now.toLocalDate(),          // 使用当前日期
                LocalTime.of(8, 0, 0)      // 设置为8点整
        );
    }
    if (CommonConstants.HeHaiTimeKey.YESTERDAY.equals(time)) {
        //减去1天
        now = LocalDateTime.of(
                now.minusDays(1).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
        // 结束日期为今日8点整
        endTime = eightForNow2(0);


    }
    if (CommonConstants.HeHaiTimeKey.LAST_DAY.equals(time)) {
        //减去2天
        now = LocalDateTime.of(
                now.minusDays(2).toLocalDate(),
                LocalTime.of(8, 0, 0)
        );
        // 结束日期为昨日8点整
        endTime = eightForNow2(1);

    }


    String startTime = now.format(formatter);
    log.info("输出开始时间:{}", startTime);
    intent.setStartTime(startTime);
    intent.setEndTime(endTime);
    return intent;
}

/**
 * 求出早8点
 */
public String eightForNow2(Integer day) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(CommonConstants.DATE_FORMAT);
    LocalDateTime now = LocalDateTime.now();
    if (day != null) {
        if (day == 0) {
            now = LocalDateTime.of(
                    now.toLocalDate(),          // 使用当前日期
                    LocalTime.of(8, 0, 0)      // 设置为8点整
            );
        } else {
            now = LocalDateTime.of(
                    now.minusDays(day).toLocalDate(),
                    LocalTime.of(8, 0, 0)
            );
        }
    }

    return now.format(formatter);
}

这个没有集成一个工具类是因为需求开发时间小,而且要求时间短,再加上是使用频率低。有常用的可以集成到你们的时间工具类中。

-------------------------------错误-------------------------------

/**
 * 根据Params求出不同的时间
 */
public Intent dateForParams(Intent intent, String time) {
    SimpleDateFormat format = new SimpleDateFormat(CommonConstants.DATE_FORMAT);

    Calendar calendar = Calendar.getInstance(); //获取日历实例
    String endTime = format.format(calendar.getTime());//后去结束时间
    calendar.setTime(date); //将当前时间设置给日历实例
    int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取当前的小时数

    // 将时间向前推移1小时
    if (CommonConstants.HeHaiTimeKey.HOUR_1.equals(time)) {
        if (hour < 1) {
            calendar.add(Calendar.DAY_OF_MONTH, -1); // 将日期向前推移1天
            hour += 24; // 计算出对应的小时数
            calendar.add(Calendar.HOUR_OF_DAY, hour - 1);
        } else {
            calendar.add(Calendar.HOUR_OF_DAY, -1);
        }

    }
    if (CommonConstants.HeHaiTimeKey.HOUR_3.equals(time)) {
        if (hour < 1) {
            calendar.add(Calendar.DAY_OF_MONTH, -1); // 将日期向前推移1天
            hour += 24; // 计算出对应的小时数
            calendar.add(Calendar.HOUR_OF_DAY, hour - 3);
        } else {
            calendar.add(Calendar.HOUR_OF_DAY, -3);
        }

    }
    if (CommonConstants.HeHaiTimeKey.HOUR_24.equals(time)) {
        calendar.add(Calendar.DAY_OF_MONTH, -1);
    }
    if (CommonConstants.HeHaiTimeKey.HOUR_48.equals(time)) {
        calendar.add(Calendar.DAY_OF_MONTH, -2);
    }
    if (CommonConstants.HeHaiTimeKey.HOUR_72.equals(time)) {
        calendar.add(Calendar.DAY_OF_MONTH, -3);
    }

    // 将日期向前推移3天
    if (CommonConstants.HeHaiTimeKey.DAY_3.equals(time)) {
        calendar.add(Calendar.DAY_OF_MONTH, -3);
        calendar.set(Calendar.HOUR_OF_DAY, 8);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
    }
    if (CommonConstants.HeHaiTimeKey.DAY_7.equals(time)) {
        calendar.add(Calendar.DAY_OF_MONTH, -7);
        calendar.set(Calendar.HOUR_OF_DAY, 8);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
    }
    if (CommonConstants.HeHaiTimeKey.DAY_15.equals(time)) {
        calendar.add(Calendar.DAY_OF_MONTH, -15);
        calendar.set(Calendar.HOUR_OF_DAY, 8);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
    }
    if (CommonConstants.HeHaiTimeKey.DAY_30.equals(time)) {
        calendar.add(Calendar.DAY_OF_MONTH, -30);
        calendar.set(Calendar.HOUR_OF_DAY, 8);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
    }
    // 将月份向前推移3个月
    if (CommonConstants.HeHaiTimeKey.THREE_MONTH.equals(time)) {
        calendar.add(Calendar.MONTH, -3);
    }
    if (CommonConstants.HeHaiTimeKey.HALF_YEAR.equals(time)) {
        // 将月份向前推移6个月
        calendar.add(Calendar.MONTH, -6);
    }

    // 将年份向前推移1年
    if (CommonConstants.HeHaiTimeKey.ONE_YEAR.equals(time)) {
        calendar.add(Calendar.YEAR, -1);
    }
    if (CommonConstants.HeHaiTimeKey.THREE_YEAR.equals(time)) {
        calendar.add(Calendar.YEAR, -3);
    }
    if (CommonConstants.HeHaiTimeKey.FIVE_YEAR.equals(time)) {
        calendar.add(Calendar.YEAR, -5);
    }
    if (CommonConstants.HeHaiTimeKey.TEN_YEAR.equals(time)) {
        calendar.add(Calendar.YEAR, -10);
    }


    //设置早上8点
    if (CommonConstants.HeHaiTimeKey.TODAY.equals(time)) {
        calendar.set(Calendar.HOUR_OF_DAY, 8);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
    }
    if (CommonConstants.HeHaiTimeKey.YESTERDAY.equals(time)) {
        //减去1天
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        calendar.set(Calendar.HOUR_OF_DAY, 8);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        // 结束日期为今日8点整
        endTime = eightForNow(null);
        intent.setEndTime(endTime);

    }
    if (CommonConstants.HeHaiTimeKey.LAST_DAY.equals(time)) {
        //减去2天
        calendar.add(Calendar.DAY_OF_MONTH, -2);
        calendar.set(Calendar.HOUR_OF_DAY, 8);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        // 结束日期为昨日8点整
        endTime = eightForNow(1);
        intent.setEndTime(endTime);
    }

    String startTime;
    Date dayTime = calendar.getTime();
    if (CommonConstants.HeHaiTimeKey.REAL_TIME.equals(time)) {
        startTime = endTime;
    } else {
        startTime = format.format(dayTime); //将时间格式化为字符串
    }
    log.info("输出开始时间:{}", startTime);
    intent.setStartTime(startTime);
    intent.setEndTime(endTime);
    return intent;
}


/**
 * 求出早8点
 */
public String eightForNow(Integer day) {

    Calendar calendar = Calendar.getInstance(); //获取日历实例
    calendar.setTime(date); //将当前时间设置给日历实例

    if (day != null) {
        calendar.add(Calendar.DAY_OF_MONTH, -day); //减去对应天数
    }

    calendar.set(Calendar.HOUR_OF_DAY, 8); //设置早上8点
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    Date yesterday8am = calendar.getTime(); //获取昨天早上8点的时间

    SimpleDateFormat format = new SimpleDateFormat(CommonConstants.DATE_FORMAT);
    String formattedDateTime = format.format(yesterday8am);
    log.info("输出开始时间:{}", formattedDateTime);
    return formattedDateTime;
}

Calendar是Java中处理日期和时间的类,它提供了各种实用方法来操作日历、时区和时间等信息。以前,Java的日期时间类主要是使用Date和SimpleDateFormat,但是这两个类存在一些问题,如线程不安全,可变性等,因此Java 1.1中引入了Calendar类来替代它们。
Calendar类是一个抽象类,不能直接创建对象,可以通过getInstance()方法获取它的实例。通过set()方法设置日期和时间信息,getTime()方法获取Date类型的时间,get()方法获取年月日等信息。
Calendar类提供了对时间进行加减的方法,add()方法用于加减某个时间单位,例如,可以使用add(Calendar.DATE, 1)增加一天,也可以使用add(Calendar.MONTH, -1)减少一个月。roll()方法则是这样做的一种变体,它只对指定的字段进行修改,而不会对较高的字段进行更改。 Calendar类也提供了很多有用的方法来操纵和显示日期和时间,如getFirstDayOfWeek()获取当前的星期起始日,getMinimum()获取给定日历字段的最小值等等。
尽管Calendar类有很多优点,它仍然没有解决Date类的基本问题。在Java 8中,LocalDateTime类被引入作为替代Calendar和Date的更简单、更灵活的实现。本地日期时间的类提供了Java程序员可以更自然地处理日期和时间的方法,避免了时间区的混淆和线程安全问题。

LocalDateTime是Java8新增加的一个日期时间类,代表的是一个不带时区的日期和时间,具有不可变性,用于处理本地日期和时间。它的实例可以存储到精确到纳秒的时间。
LocalDateTime的初始化可以通过now()调用获取当前的日期和时间,也可以通过of()方法创建指定的日期和时间。其中,now()方法的具体实现是通过系统时钟获取当前的时间,of()方法则接受七个参数,分别是年、月、日、时、分、秒、纳秒顺序。
LocalDateTime还提供了很多方法来操纵日期和时间,比如加减日期时间、计算日期之间的间隔、格式化日期时间等。这样可以很方便地进行日常的开发工作。对于需要考虑时区的应用来说,Java8还提供了ZonedDateTime类。
LocalDateTime是一种非常实用的日期和时间处理类,它可以满足大多数应用对日期和时间的需求。

上面都是一些官网给出的答案,由此我们也可以看出,使用LocalDateTime是更好的一种选择,还在用calender的可以尝试替换了,不要停留在旧时代里。

代码就不具体讲解了也不是很难,注释也挺多,有什么不懂得可以评论下方提出,看到后会抓紧回复的。

ps:有的小伙伴可能的确是刚接触,这里提供一个calender的示例,自己试着修改成LocalDateTime,前者你可以不会,后者不行哦。

public static void main(String[] args) throws ParseException {
String dateTimeString = “2023-06-13 02:00:00”;
SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
Date date1 = format.parse(dateTimeString); // 解析为 Date 对象

Calendar calendar = Calendar.getInstance(); //获取日历实例
calendar.setTime(date1); //将当前时间设置给日历实例

//这里零时转换可以忽略,LocalDateTime没有这方面的烦恼
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取当前的小时数
if (hour < 1) { // 如果小时数小于1,则需要特殊处理
    calendar.add(Calendar.DAY_OF_MONTH, -1); // 将日期向前推移1天
    hour += 24; // 计算出对应的小时数
}
//calendar.set(Calendar.HOUR_OF_DAY, hour - 72); // 将时间向前推移1小时
calendar.add(Calendar.YEAR, -10); // 将年份向前推移10年


Date yesterday8am = calendar.getTime();
String formattedDateTime = format.format(yesterday8am); //将时间格式化为字符串
System.out.println("输出结果:"+formattedDateTime); //输出结果

}

今天就到这里吧,感觉有用的小伙伴可以点个赞,你的支持就是我更新的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/34145.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络——数据链路层

序言 问&#xff1a;数据链路层在现在的社会起到什么作用&#xff1f; 答&#xff1a;数据链路层在现在的社会起到关键性作用&#xff0c;比如&#xff1a;数据传输和通信&#xff1b;网络连接和互联互通&#xff1b;错误检测和纠正&#xff1b;媒体访问控制&#xff1b;网络性…

启动一个qemu虚拟机

安装qemu&#xff1a; 编译内核&#xff1a; 编译rootfs&#xff1b; 启动&#xff1a; qemu-system-x86_64 -kernel ./linux-4.14.320/arch/x86_64/boot/bzImage -hda ./busybox-1.36.1/rootfs.img -append "root/dev/sda consolettyS0" -nographic 效果图&am…

【Tensorflow object detection API + 微软NNI】图像分类问题完成自动调参,进一步提升模型准确率!

1. 背景&目标 利用Tensorflow object detection API开发并训练图像分类模型&#xff08;例如&#xff0c;Mobilenetv2等&#xff09;&#xff0c;自己直接手动调参&#xff0c;对于模型的准确率提不到极致&#xff0c;利用微软NNI自动调参工具进行调参&#xff0c;进一步提…

Cisco Catalyst 8000 Series Edge Platforms, IOS XE Release Dublin-17.11.01a ED

Cisco Catalyst 8000 Series Edge Platforms, IOS XE Release Dublin-17.11.01a ED Cisco Catalyst 8000 边缘平台系列 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-catalyst-8000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&…

国企一面会问什么?

前言&#xff1a; \textcolor{Green}{前言&#xff1a;} 前言&#xff1a; &#x1f49e;快秋招了&#xff0c;那么这个专栏就专门来记录一下&#xff0c;同时呢整理一下常见面试题 &#x1f49e;部分题目来自自己的面试题&#xff0c;部分题目来自网络整理 国企注重的和私企会…

AI实战营第二期 第七节 《语义分割与MMSegmentation》——笔记8

文章目录 摘要主要特性 案例什么是语义分割应用&#xff1a;无人驾驶汽车应用&#xff1a;人像分割应用&#xff1a;智能遥感应用 : 医疗影像分析 三种分割的区别语义分割的基本思路按颜色分割逐像素份分类全卷积网络 Fully Convolutional Network 2015存在问题 基于多层级特征…

多元回归预测 | Matlab基于灰狼算法(GWO)优化混合核极限学习机HKELM回归预测, GWO-HKELM数据回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于灰狼算法(GWO)优化混合核极限学习机HKELM回归预测, GWO-HKELM数据回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 …

[游戏开发][Unity]出包真机运行花屏(已解决)

花屏真机截屏 原因 原因是启动项目时的第一个场景没有相机是 Skybox或者SolidColor模式&#xff0c;我的启动场景只有一个UI相机&#xff0c;且Clear Flags是DepthOnly 解释&#xff1a; https://blog.csdn.net/yanchezuo/article/details/79002318

三、1如何运用设计原则之SOLID原则写出高质量代码?

你好我是程序员雪球。接下来我们学习一些经典的设计原则。其中包括SOLID&#xff0c;KISS&#xff0c;YAGNI&#xff0c;DRY&#xff0c;LOD等。其实这些设计原则从字面意思理解并不难。但是“看懂”和“会用”是两回事&#xff0c;而“用好”就难上加难了。 先来了解SOLID原则…

(css)el-image图片完整显示,不拉伸收缩

(css)el-image图片完整显示&#xff0c;不拉伸收缩 <el-imagefit"contain" //重要设置src"../../../../1.png"altclass"chenguo_img_img" />

自动驾驶货车编队行驶-车辆通讯应用层数据交互要求

1 范围 本文件规定了合作式自动驾驶货车编队行驶时车辆通信应用层数据交互的通信系统架构、通用要求、 数据交互要求、消息层数据集定义等。本文件仅涉及编队成员内部进行编队控制及成员管理相关的车-车通 信交互&#xff0c;不涉及编队与其他实体&#xff08;云平台、路侧单元…

spring cloud 之 gateway

网关介绍 在微服务架构体系中&#xff0c;一个系统会被拆分为很多个微服务&#xff0c;那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别调用&#xff0c;当然这样是不现实的…

高性能消息中间件 RabbitMQ

一、RabbitMQ概念 1.1 MQ是什么 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复&#xff1a; 异步通信相…

基于Arduino UNO的循迹小车

目录 1.analogWrite函数的使用 2.红外循迹模块介绍 3.循迹小车代码实现 4.实物示例 1.analogWrite函数的使用 用analogWrite来替换digitalWrite 说明 将一个模拟数值写进Arduino引脚。这个操作可以用来控制LED的亮度, 或者控制电机的转速. 在Arduino UNO控制器中&#…

查询Oracle当前用户下,所有数据表的总条数

需求&#xff1a;查询Oracle当前用户下&#xff0c;所有数据表的总条数 方法&#xff1a;存储过程 右键点击Procedures&#xff0c;点击New 点击OK 把存储过程写进去&#xff0c;然后点击编译运行&#xff1a; create or replace procedure tables_count ist_count numbe…

xshell安装jdk1.8环境

xshell安装jdk1.8环境 大家好&#xff0c;今天我们来学习一下xshell安装jdk1.8环境&#xff0c;好好看&#xff0c;好好学&#xff0c;超详细的 第一步 进入xshell官网下载 第二步 打开xshell新建一个会话&#xff0c;如下图&#xff1a; 第三步 输入你的名称、主机ip、端口号(…

CSS中伪类详解和用法例子详解

文章目录 一、伪类介绍二、伪类选择器1.动态伪类2.结构伪类3.否定伪类4.状态伪类5.目标伪类 一、伪类介绍 用于已有元素处于某种状态时&#xff08;滑动、点击等&#xff09;为其添加对应的样式&#xff0c;这个状态是根据用户行为而动态变化的。 二、伪类选择器 动态伪类作…

Arduino uno 环境配置 for Mac

1、IDE 在官网下载 官网地址&#xff1a;https://www.arduino.cc/en/software 看到钱&#x1f4b0;不要怕&#xff0c;只是问你捐不捐款&#xff0c;不收钱&#xff0c;你直接安装就行 &#xff08;你也可以捐一点&#xff5e;&#xff09; 安装之后 2、安装驱动 地址 &…

互联网+洗鞋店预约小程序新模式;

互联网洗鞋店预约小程序 1、线上线下业务的结合。 传统的线下业务消费者到店可以向其推介线上的预约到家服务&#xff0c;让线下的消费者成为小程序内的会员&#xff0c;留存客户之后线上可直接触达&#xff0c;减少与消费者的距离&#xff0c;从等待客户到可以主动出击&…

黑客是什么?想成为黑客需要学习什么?

什么是黑客 在《黑客辞典》里有不少关于“黑客”的定义, 大多和“精于技术”或“乐于解决问题并超越极限”之类的形容相关。然而&#xff0c;若你想知道如何成为一名黑客&#xff0c;只要牢记两点即可。 这是一个社区和一种共享文化&#xff0c;可追溯到那群数十年前使…