版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TechnicalGuideJava16时间日期数字处理全指南从Date/Calendar到java.time,从NumberFormat到DecimalFormat的完整实践CHAPTER01旧版时间日期API回顾与痛点Date、Calendar和SimpleDateFormat的历史包袱与设计缺陷HistoricalDebtjava.util.Date的设计缺陷java.util.Date作为JDK1.0就存在的元老级API,其设计缺陷已成为Java社区的共识:月份从零计数、对象可变导致线程不安全、年份偏移量反直觉,这些历史包袱直接催生了java.time包的诞生。01月份从0开始计数(0=一月,11=十二月),违反人类直觉,几乎所有初学者都会在此处产生off-by-one错误02Date对象是可变的(mutable),一旦创建即可通过setYear()等方法修改,在多线程环境下极易引发难以排查的并发Bug03年份以1900为基准偏移量存储,2024年需写成newDate(124,0,1),语义模糊且容易与公元纪年混淆04日期与时间强制绑定,无法单独表示'纯日期'或'纯时间'概念,业务建模时被迫携带无意义的零值时分秒JAVADATEAPICalendar的复杂性与隐蔽陷阱Calendar试图修补Date的缺陷却引入了更大的复杂性:冗长的API调用链、默认的宽松模式导致无效日期静默进位、可变对象的线程安全隐患,以及日期毫秒计算中极易触发的整数溢出问题。01calendar.get(Calendar.MONTH)API调用极其冗长,获取月份需写完整路径,设置日期需连续调用多个set()方法,代码可读性差且容易遗漏字段02lenient=true默认开启宽松模式,设置月份为13时不抛异常而是静默进位到次年1月,在数据校验场景下导致无效输入被错误接受03可变对象与Date同样存在可变性问题,Calendar实例可被随意修改,多线程共享时必须额外加锁或每次创建新实例,性能开销显著04int溢出日期毫秒计算存在整数溢出风险:12×60×60×1000在int范围内,但30×24×60×60×1000会超出int最大值变成负数,必须显式强转longJavaConcurrencyPitfallsSimpleDateFormat线程安全隐患SimpleDateFormat是旧版API中最大的"隐形炸弹":非线程安全却常被定义为static全局复用,高并发下导致日期解析错乱或异常,且问题极难复现定位,是Java项目中最常见的线上Bug来源之一。01共享Calendar状态SimpleDateFormat内部使用共享的Calendar实例进行解析和格式化,多线程并发调用时Calendar状态被互相覆盖,导致解析结果错乱02staticfinal全局复用典型错误模式:定义为privatestaticfinalSimpleDateFormat全局复用,高并发时必现问题03ThreadLocal隔离ThreadLocal方案可为每个线程维护独立实例,但需注意线程池场景下的内存泄漏风险,线程销毁前必须调用remove()清理04迁移DateTimeFormatter根本解决之道是迁移到java.time.format.DateTimeFormatter,不可变且线程安全,可安全定义为staticfinal全局常量LegacyAPIAudit旧版API问题全景对比Date、Calendar、SimpleDateFormat三大旧版API的共同缺陷可归纳为三个维度:可变性导致线程不安全、API设计违反直觉、功能边界模糊。这些系统性问题是推动JSR-310(java.time)诞生的根本动因。旧版时间日期API核心问题对比API类设计缺陷线程安全典型踩坑场景java.util.Date月份从0计数,年份偏移1900,日期时间强制绑定不安全(可变对象)newDate(2024,1,1)实际表示3925年2月1日java.util.CalendarAPI冗长,lenient模式静默进位,月份仍从0计数不安全(可变对象)设置月份为13不进位报错,静默变为次年1月SimpleDateFormat非线程安全,模式字符串无编译期校验不安全(共享Calendar)static全局变量在高并发下解析出错误日期三大旧版API均存在可变性、非线程安全和反直觉设计问题,已被java.time包全面替代Chapter02java.time新API核心类详解不可变、线程安全、语义清晰的现代时间日期处理框架DesignPhilosophyjava.time包的设计哲学java.time包由Joda-Time作者StephenColebourne主导设计(JSR-310),以不可变性、职责分离和流畅API为三大设计原则,从根本上解决了旧版API的线程安全隐患和语义模糊问题。Principles三大设计原则不可变性所有核心类均为final且字段不可修改,任何修改操作都返回全新实例。这种设计天然线程安全,无需额外同步机制,彻底消除了并发环境下的数据竞争风险。职责分离日期、时间、时区各自独立建模,通过LocalDate、LocalTime、ZoneId等细分类型精确表达不同概念,API语义清晰无歧义,开发者可按需组合使用。流畅APIof()、parse()、plus()、minus()等方法命名语义化,支持链式调用。代码可读性接近自然语言,如now.plusDays(3).atStartOfDay()直观表达业务意图。CoreClasses核心类族谱Local系列LocalDate、LocalTime、LocalDateTime不带时区信息,专注于本地时间的表达。适用于生日、营业时间、节假日等与时区无关的业务场景,简洁且高效。Zoned系列ZonedDateTime、OffsetDateTime携带完整时区或偏移量信息,精确表示全球唯一时间点。适用于跨时区调度、航班起降、国际化会议等全球化业务场景。Instant与DurationInstant表示Unix纪元时间戳,Duration表示精确纳秒级时间跨度。二者专为机器时间设计,适用于性能计时、日志记录、超时控制等技术底层场景。JavaTimeAPILocalDate:纯日期处理的标准选择LocalDate是java.time中使用频率最高的类,表示不含时间和时区的纯日期,不可变设计使其天然线程安全。01三种创建方式of(2024,3,15)直接指定、now()获取当前日期、parse()字符串解析,月份从1计数符合直觉1-based02日期计算链式调用plusDays(7)加一周、minusMonths(3)减三月、withDayOfMonth(1)定位月初,操作返回新实例链式03实用查询方法getDayOfWeek()返回枚举、lengthOfMonth()当月天数、isLeapYear()判断闰年、isBefore/isAfter比较DayOfWeek04与旧API互转通过Date.from(Instant)和date.toInstant()在LocalDate与Date之间桥接,保障遗留系统渐进式迁移Instantjava.timeLocalTime与LocalDateTimeLocalTime处理纯时间场景,LocalDateTime组合日期与时间但不含时区,跨时区必须升级为ZonedDateTime。LocalTime纯时间表示时分秒纳秒,精确到纳秒级,适用于「每天9:00开会」「营业时间10:00-22:00」等不含日期的时间场景支持of(14,30,15)创建、now()获取当前时间、parse('14:30:15')解析,以及plus/minus做时间加减运算TimeOnlyLocalDateTime日期+时间组合LocalDate与LocalTime,表示「2024年3月15日14:30」这种本地日期时间,是业务系统中最常见的日期时间类型可通过of(2024,3,15,14,30)直接创建,也可用LocalDate.atTime(LocalTime)或localDate.plusTime()组合生成重要限制:不含时区信息,同一LocalDateTime在不同时区对应不同实际时刻,跨时区场景必须使用ZonedDateTimeDate+Time·NoZoneJAVATIMEAPIInstant、Duration与PeriodInstant表示时间线上的精确点(机器视角),Duration衡量秒/纳秒级时间跨度(适合性能计时),Period衡量年/月/日级日期跨度(适合业务计算)。三者配合覆盖了从系统级到业务级的所有时间间隔场景。Instant精确时间点Instant.now()基于Unix纪元的时间戳(秒+纳秒),Instant.now()获取当前精确时刻,适合日志记录、性能计时和系统间时间传递atZone(ZoneId)支持plus/minus做时间偏移、与Duration配合计算耗时,可通过atZone(ZoneId)转换为带时区的ZonedDateTimeInstant.now()Duration精确时间跨度Duration.between()以秒和纳秒为单位衡量时间量,Duration.between()计算两个时间点差值,适合接口耗时统计和超时控制toMillis()toMinutes()ofSeconds()提供toMillis()、toMinutes()等便捷转换,支持ofSeconds()等工厂方法创建固定时长Duration.between()Period日期级跨度Period.between()以年/月/日为单位衡量日期量,Period.between()计算两个日期间隔,适合年龄计算、合同期限和倒计时与Duration的关键区别:Period考虑日历规则(如闰年、大小月),Duration只关心绝对时间秒数Period.between()JAVATIMEAPIDateTimeFormatter:线程安全的格式化方案DateTimeFormatter彻底解决了SimpleDateFormat的线程安全问题:不可变设计允许安全地定义为staticfinal全局常量,丰富的预定义格式化器覆盖常见场景,模式字符串错误在创建时即可发现而非运行时才暴露。不可变且线程安全可安全定义为staticfinalDateTimeFormatter全局常量复用,无需每次创建新实例预定义格式化器开箱即用ISO_LOCAL_DATE(2024-03-15)、ISO_LOCAL_DATE_TIME、BASIC_ISO_DATE等覆盖常见场景自定义模式与本地化ofPattern('yyyy年MM月dd日')支持中文格式,ofLocalizedDate(FormatStyle.FULL)自动适配系统语言环境格式化与解析格式化用date.format(formatter)、解析用LocalDate.parse(),模式语法错误在ofPattern时立即抛异常JAVATIMEAPI日期计算实战技巧与TemporalAdjustersTemporalAdjusters提供了丰富的内置日期调整器(月末、下一个周一、季度首日等),通过with()方法链式调用即可实现复杂日期计算。01内置调整器覆盖高频场景:firstDayOfMonth()、lastDayOfMonth()、next(MONDAY)、firstInMonth(FRIDAY),通过date.with(adjuster)一行代码完成.with()02自定义TemporalAdjuster实现业务逻辑:如"下一个工作日"需跳过周末和节假日,实现TemporalAdjuster接口的adjustInto方法即可adjustInto03日期比较直观清晰:isBefore()、isAfter()、isEqual()返回boolean,compareTo()支持排序,替代旧API中before()/after()的混乱语义boolean04区间计算区分两种模式:Period.between()获取年月日差值,ChronoUnit.DAYS.between()获取精确天数差,两者适用场景不同需注意区分PeriodCHAPTER03数字格式化NumberFormat与DecimalFormat从货币显示到科学计数法,掌握数字呈现的完整控制力APIARCHITECTURENumberFormat体系结构与核心功能NumberFormat作为数字格式化的抽象基类,通过工厂方法提供通用数字、货币、百分比三种格式化模式,并天然支持国际化——同一数字在不同Locale下自动适配千位分隔符和小数点符号的差异。核心工厂方法01三种工厂方法—getNumberInstance()通用数字格式(自动千位分隔)、getCurrencyInstance()货币格式(含符号)、getPercentInstance()百分比格式(自动乘100加%)02Locale参数—getCurrencyInstance(Locale.CHINA)输出¥1,234.56,getCurrencyInstance(Locale.US)输出$1,234.5603格式化-解析闭环—format(double)将数字转为字符串、parse(String)将字符串解析为Number对象子类体系01DecimalFormat—最常用的子类,通过模式字符串精确控制数字显示格式,支持固定小数位、科学计数法、自定义分隔符等高级功能02ChoiceFormat—用于条件格式化,可根据数值范围返回不同字符串(如0→无数据、1→1条记录、2+→多条记录),适合国际化消息模板JavaNumberFormatDecimalFormat模式字符串详解DecimalFormat通过模式字符串精确控制数字显示格式。'0'为强制位(无数字补零),'#'为可选位(无数字省略),配合小数点、千位分隔符和百分比符号,可覆盖从财务报表到科学数据的全部格式化需求。LIVE"#,##0.00"1,234,567.80输入1234567.8强制位vs可选位'0'无数字补零,'#'无数字省略,灵活控制显示精度"0.00"→1.20"0.##"→1.2千位分隔符逗号分隔千位,适合财务报表和大数据量展示"#,##0.00"1,234,567.80前导补零固定输出宽度,适合编号、序列号等定宽场景"00000"→4200042百分比与千分比自动乘以100或1000并附加后缀符号"0.0%"→12.3%"0.0‰"→123.0‰Format&ParseDecimalFormat处理科学计数法DecimalFormat通过E表示法模式字符串支持科学计数法格式化,可精确控制小数位数和指数显示格式。但需注意格式化(数字→字符串)与解析(字符串→数字)的不对称性——解析科学计数法字符串需使用Double.parseDouble()等替代方案。01E表示法模式'0.00E0'将1234567格式化为'1.23E6',小数点前的0控制尾数整数位数,小数点后的00控制小数位数。1.23E602指数位数控制E后跟一个0表示指数至少一位(如E6),跟两个00表示至少两位(如E06),可根据显示需求灵活配置。E0/E0003大小写控制大写E输出'1.23E6',小写e输出'1.23e6',与显示场景的惯例保持一致。Evse04解析限制DecimalFormat不直接支持科学计数法字符串的解析,需使用Double.parseDouble('1.23E6')或自定义解析逻辑。parseDoubleInternationalization货币格式化与国际化数字显示货币格式化需严格遵循目标地区的显示规范——货币符号位置、千位分隔符、小数点符号在不同Locale下差异显著。NumberFormat通过Locale自动适配这些差异,是国际化应用中数字显示的基础设施。CurrencyInstance自动适配货币符号与格式getCurrencyInstance(Locale)根据地区自动输出货币格式。中国显示为¥1,234.56,美国显示为$1,234.56,德国显示为1.234,56€。符号位置、千位分隔符和小数点符号均遵循当地规范,无需手动处理。¥·$·€SeparatorRules千位分隔符的Locale差异英语国家使用逗号作为千位分隔符、点号作为小数点;德语国家则相反,使用点号分隔千位、逗号作为小数点。手动拼接字符串极易出错,应始终使用NumberFormat自动处理。,vs.Accounting会计格式定制通过DecimalFormat模式实现负数括号表示,使用分号分隔正负格式:#,##0.00;(#,##0.00)。输出结果为(1,234.56),符合财务报表规范,便于快速识别负数金额。(1,234.56)PrecisionBigDecimal配合使用涉及金额的精确计算必须使用BigDecimal而非double,避免浮点数精度误差。格式化时通过formatter.format(bigDecimal)进行转换,确保计算结果与显示结果完全一致。BigDecimalCHAPTER04时区处理与跨时区计算从ZoneId到ZonedDateTime,精确处理全球任意时区的时间转换JavaTimeAPI·CoreConceptsZoneId与ZoneOffset核心概念ZoneId表示包含完整历史规则的地理时区(能自动处理夏令时),ZoneOffset表示固定的UTC偏移量。跨时区业务应优先使用ZoneId以确保夏令时转换的正确性,避免使用过时的三字母时区缩写(如EST、CST)。ZoneId区域格式使用"区域/城市"格式(如Asia/Shanghai、America/New_York),包含该地区完整的时区历史和夏令时规则。区域/城市ZoneOffset固定偏移固定偏移量(如+08:00、-05:00),不随夏令时变化,仅适用于明确不需要夏令时处理的场景。+08:00最佳实践优先用ZoneId.of('Asia/Shanghai')而非ZoneOffset.ofHours(8),前者能自动处理历史规则变更和夏令时切换。ZoneId.of()时区标识查询getAvailableZoneIds()返回全球600+时区标识符,可通过过滤找到目标时区;避免使用CST等多义缩写。600+JAVATIMEAPIZonedDateTime创建与时区转换ZonedDateTime表示带时区的精确时刻,是全球唯一的时间点。时区转换通过withZoneSameInstant()实现(保持绝对时刻不变,改变本地显示时间),夏令时规则由ZoneId自动处理,无需手动计算偏移量。三种创建方式now(ZoneId)获取指定时区当前时间、localDateTime.atZone(zoneId)附加时区、of()直接指定年月日时分秒和时区。这三种方式覆盖了从系统时钟、已有本地时间到完整时间戳的创建需求。now()·atZone()·of()时区转换withZoneSameInstant(newZone)保持绝对时刻不变仅改变本地显示,如北京时间14:00转为纽约时间02:00。该方法确保同一时刻在不同时区的表示一致性,是跨时区数据同步的核心。14:00北京→02:00纽约本地时间保持withZoneSameLocal(newZone)保持本地时间不变仅改时区标签,适用于跨时区会议排期场景。例如会议定在北京时间10:00,转换为纽约时区后显示为同一天10:00(EST),便于参与者按各自本地时间理解。SameLocal跨时区排期夏令时自动处理3月美国夏令时开始时,2:00–3:00不存在,ZonedDateTime会自动调整到有效时间,无需手动干预。ZoneId内置完整的IANA时区数据库,自动处理全球各地区的夏令时切换规则。DST自动调整JAVA·TIMEZONE跨时区计算实战与整数溢出防范手动计算时差毫秒数时,int类型的整数溢出是最隐蔽的Bug来源——30天的毫秒数即超出int上限。最佳实践是直接使用ZonedDateTime.withZoneSameInstant()进行时区转换,彻底规避手动毫秒计算。01经典陷阱:毫秒溢出12×60×60×1000=43,200,00030×24×60×60×1000=2,592,000,00012×60×60×1000=43,200,000(int范围内),但30×24×60×60×1000=2,592,000,000超出int最大值2,147,483,647,溢出为负数2.59B>2.14B02防御方案一:显式强转long(long)12*60*60*1000(long)12*60*60*1000,首个操作数转为long后,整个表达式自动类型提升为long运算,避免中间步骤溢出(long)强转03防御方案二:java.timeAPI(推荐)beijingTime.withZoneSameInstant(ZoneId.of("America/New_York"))使用beijingTime.withZoneSameInstant(ZoneId.of("America/New_York"))直接转换,无需手动计算毫秒差,从根源消除溢出风险withZoneSameInstant04类型提升与代码可读性Date.getTime()Date.getTime()返回long类型,与int做减法时自动提升为long,但显式使用long更清晰安全,符合代码可读性最佳实践long>intJavaTimeAPIOffsetDateTime与Instant的选型策略Instant用于系统级时间戳(日志、计时),OffsetDateTime用于API传输(ISO-8601格式),ZonedDateTime用于用户界面展示。三者各司其职,混用会导致夏令时处理错误或序列化兼容性问题。各场景推荐类型01数据库存储Instant或long时间戳,最紧凑且无歧义;避免存储LocalDateTime(丢失时区信息导致无法还原精确时刻)Instant02API传输OffsetDateTime配合ISO-8601(如2024-03-15T14:30:00+08:00),接收方可按自身时区转换OffsetDateTime03用户展示ZonedDateTime格式化输出,自动适配用户所在时区和语言环境ZonedDateTime转换关系Instant→ZonedDateTime附加时区信息后变为人类可读时间instant.atZone(ZoneId.of('Asia/Shanghai'))ZonedDateTime→Instant剥离时区信息还原为机器时间戳,适合持久化和跨系统传递zdt.toInstant()CHAPTER05异常处理与程序健壮性从try-catch-finally到自定义异常,构建可靠的日期数字处理逻辑EXCEPTIONHIERARCHYJava异常体系结构概览Java异常体系以Throwable为根节点,分为不可处理的Error和可处理的Exception,日期数字处理中两类异常均会遇到。Error分支OutOfMemoryError、StackOverflowError等系统级严重错误,程序通常无法恢复也不应捕获,由JVM自行处理JVM级受检异常(Checked)IOException、ParseException等,编译器强制要求try-catch或throws声明,遗漏会导致编译失败编译期运行时异常(Runtime)NullPointerException、IllegalArgumentException、DateTimeException等,编译器不强制处理但应在逻辑层面预防运行期日期数字相关异常归属SimpleDateFormat.parse()抛ParseException(受检),DateTimeFormatter.parse()抛DateTimeParseException(运行时)日期处理EXCEPTIONHANDLINGtry-catch-finally正确用法与最佳实践异常处理的核心原则是"精确捕获、优雅降级、资源安全释放"。catch块按子类→父类顺序排列,finally确保资源释放(但禁止return),try-with-resources是现代Java中资源管理的推荐写法。catch块排序铁律子类异常必须在父类异常前面,如先catchDateTimeParseException再catchDateTimeException,否则编译器报错子类→父类finally块始终执行用于释放资源(关闭流、归还连接),但禁止在finally中return——它会静默覆盖try/catch中的返回值和异常禁止returntry-with-resources实现AutoCloseable的资源在try块结束时自动关闭,无需手写finally,代码更简洁且不易遗漏资源释放Java7+日期解析异常范式catchDateTimeParseException后返回Optional或默认值,而非让异常传播到UI层,如parseOrNull(text)返回null表示失败Optional返回ExceptionHandling日期解析异常处理实战用户输入的日期数据天然不可靠——月份超范围、日期不存在、格式不匹配都是常见情况。业务层应设计容错策略:单条交互返回友好提示,批量导入跳过无效记录并汇总错误报告。严格模式vs宽松模式java.time默认严格校验,13月32日直接抛异常;Calendar默认宽松,静默进位到合法日期。业务应根据场景选择策略。DateTimeParseException单条交互容错try-catch捕获异常,向用户返回"您输入的日期格式不正确,请使用yyyy-MM-dd格式"等友好提示。try-catch批量导入容错逐条解析并catch异常,跳过无效记录继续处理,最终汇总成功与失败数量及失败详情。987/1000输入预校验解析前用正则表达式做格式校验(如^\d{4}-\d{2}-\d{2}$),减少无效输入进入解析环节,提升性能。RegexCHAPTER06实战案例与最佳实践总结从遗留系统迁移到日常开发,构建可靠的时间日期数字处理方案MIGRATIONSTRATEGY旧API到java.time的渐进式迁移策略遗留系统的迁移应采用渐进策略而非全面重写:新代码全面使用java.time,旧代码通过转换桥接层逐步替换,优先处理风险最高的SimpleDateFormat全局变量问题。四步迁移路径01新代码禁令所有新编写的日期时间逻辑必须使用java.time,不再引入Date、Calendar、SimpleDateFormatjava.timeonly02边界桥接Date.toInstant()→Instant.atZone(zoneId)→ZonedDateTime,Calendar走同样路径toInstant()03风险优先优先消除staticSimpleDateFormat全局变量,替换为staticfinalDateTimeFormatterThread-safe04数据库映射JDBC4.2+支持getObject(col,LocalDateTime.class),DATETIME与TIMESTAMP原生映射JDBC4.2+迁移注意事项时区一致性确保旧代码隐式时区与新代码显式时区一致,避免转换时出现8小时偏差单元测试覆盖为每个转换点编写测试用例,覆盖跨夏令时边界与闰年2月29日等边界值JAVA.TIMEINACTION高频业务场景实战解决方案掌握TemporalAdjusters、StreamAPI与ChronoUnit的组合使用,可覆盖90%以上的业务日期计算需求。工作日天数计算datesUntil()生成日期流,filter排除周末与节假日,count()得到工作日总数Stream本月/本周起止时间firstDayOfMonth()/lastDayOfMonth()获取月首末,DayOfWeek配合previous/next获取周起止TemporalAdjusters日期区间判断isAfter()+isBefore()判断开区间,加isEqual()可扩展为闭区间判断isAfter/isBefore定时任务时间控制Instant.now().plus(Duration.ofMinutes(30))计算下次执行时间,ChronoUnit计算剩余间隔ChronoUnitJAVAFORMATTING数字格式化的隐蔽陷阱与解决方案DecimalFormat与NumberFormat同样不是线程安全的,涉及金额时必须使用BigDecimal而非double避免精度丢失,百分比和货币格式化需手动配置小数位数以满足业务精度要求。DecimalFormat线程不安全内部维护可变状态,不可定义为static全局复用;解决方案为ThreadLocal或每次new新实例,确保多线程环境下的格式安全。ThreadLocal金额计算禁用double0.1+0.2≠0.3,IEEE754浮点精度问题;必须用Bi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- escesa非心脏手术指南心血管病评估和管理
- i药物及其临床应用
- DNA是主要的遗传物质白慧涓
- B8先期产品质量规划课程讲义
- C++大学教程指针和基本指针的字符串
- ABO血型课件适合中小学生
- 2026年智能工业设计类资格考试智能工业设计师资格试卷
- 2026年汽车工程师《汽车设计技术》真题卷
- 2026年珐琅工艺毕设题目及答案
- 车辆消防安全课件
- 《建筑施工土石方工程安全技术规范》JGJ180
- GB/T 19822-2024铝及铝合金硬质阳极氧化膜规范
- TSG+23-2021气瓶安全技术规程
- 重点传染病防治学习通超星课后章节答案期末考试题库2023年
- 机械制图机械制图基础知识课件
- 《光伏发电工程可行性研究报告编制规程》(NB/T32043-201)中文版
- 小岛区块链(区块链、数字资产和通证)
- 校长培训精美课件
- 商场招商策略报告
- 滁州市珠龙广卫绢云母粉厂滁州市南谯区将军山绢云母矿1万吨-年露天采矿工程项目环境影响报告书
- 《山东省情省况》知识考试参考题库(含解析)
评论
0/150
提交评论