1# 使用Node-API接口进行Date相关开发 2 3## 简介 4 5Node-API中date相关接口用于处理ArkTS Date对象,并在Node-API模块和ArkTS代码之间进行日期数据的转换和处理。这对于在Node-API模块中处理时间和日期相关逻辑非常有用。 6 7## 基本概念 8 9在Node-API的中,ArkTS Date对象的数据表示从UTC时间1970年1月1日0时0分0秒起至现在的总毫秒数。 10 11ArkTS Date对象提供了一种在ArkTS中表示和操作日期和时间的方式。它们允许您创建表示特定时刻的日期对象,执行各种日期和时间相关的计算(如添加或减去时间间隔),以及格式化日期为字符串以供显示。 12 13在Node-API中,通过提供与Date对象交互的函数,Node-API模块能够更紧密地与ArkTS环境集成,执行更复杂的日期和时间相关操作。 14 15## 场景和功能介绍 16 17以下Node-API函数通常在开发Node-API模块中与ArkTS的Date对象进行交互时使用,来处理和操作日期数据。以下是一些可能的使用场景: 18| 接口 | 描述 | 19| -------- | -------- | 20| napi_create_date | 在需要根据当前系统时间或特定计算生成一个Date对象时,可通过使用此接口创建表示这些时间的ArkTS Date对象,然后将其传递给ArkTS代码进行进一步处理。 | 21| napi_get_date_value | 在Node-API模块中接收到一个ArkTS的Date对象,并且需要获取其对应的时间戳或日期值时,可以使用此接口。| 22| napi_is_date | 在需要确定一个ArkTS对象是否为Date对象时,可使用此接口判断给定的值是否为Date对象。例如,在接收函数参数时,需要验证参数是否为Date对象以确保正确的数据类型。 | 23 24## 使用示例 25 26Node-API接口开发流程参考[使用Node-API实现跨语言交互开发流程](use-napi-process.md),本文仅对接口对应C++及ArkTS相关代码进行展示。 27 28### napi_create_date 29 30通过一个C++的double数据创建ArkTS的Date。 31 32cpp部分代码 33 34```cpp 35#include "napi/native_api.h" 36 37static napi_value CreateDate(napi_env env, napi_callback_info info) 38{ 39 // 获取传入的Unix Time Stamp时间 40 double value = 1501924876711; 41 // 调用napi_create_date接口将double值转换成表示日期时间,并创建成一个ArkTS对象放入returnValue中 42 napi_value returnValue = nullptr; 43 napi_create_date(env, value, &returnValue); 44 return returnValue; 45} 46``` 47 48接口声明 49 50```ts 51// index.d.ts 52export const createDate: () => Date; 53``` 54 55ArkTS侧示例代码 56 57```ts 58import hilog from '@ohos.hilog' 59import testNapi from 'libentry.so' 60 61hilog.info(0x0000, 'testTag', 'Test Node-API napi_create_date: %{public}s', testNapi.createDate().toString()); 62``` 63 64### napi_get_date_value 65 66获取给定ArkTS Date对应的C++ double值。 67 68cpp部分代码 69 70```cpp 71#include <hilog/log.h> 72#include "napi/native_api.h" 73 74static napi_value GetDateValue(napi_env env, napi_callback_info info) 75{ 76 size_t argc = 1; 77 napi_value args[1] = {nullptr}; 78 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 79 80 // 获取传入的Unix Time Stamp时间 81 double value = 0; 82 napi_status status = napi_get_date_value(env, args[0], &value); 83 if (status != napi_ok) { 84 napi_throw_error(env, nullptr, "napi_get_date_value fail"); 85 return nullptr; 86 } 87 88 // 将获取到的Unix Time Stamp时间打印 89 OH_LOG_INFO(LOG_APP, "Node-API gets unix time stamp is:%{public}lf.", value); 90 91 // 把转换后的Unix Time Stamp时间创建成ArkTS double数值,并放入returnValue中 92 napi_value returnValue = nullptr; 93 napi_create_double(env, value, &returnValue); 94 return returnValue; 95} 96``` 97 98接口声明 99 100```ts 101// index.d.ts 102export const getDateValue: (date: Date) => number | void; 103``` 104 105ArkTS侧示例代码 106 107```ts 108import hilog from '@ohos.hilog' 109import testNapi from 'libentry.so' 110try { 111 const date = new Date(); 112 hilog.info(0x0000, 'testTag', 'Node-API: output the Unix Time Stamp: %{public}d', date.getTime()); 113 hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_date_value: %{public}d', testNapi.getDateValue(date)); 114} catch (error) { 115 hilog.error(0x0000, 'testTag', 'Test Node-API napi_get_date_value error: %{public}s', error.message); 116} 117``` 118 119### napi_is_date 120 121判断给定ArkTS value是否为ArkTS Date对象。 122 123cpp部分代码 124 125```cpp 126#include "napi/native_api.h" 127 128static napi_value IsDate(napi_env env, napi_callback_info info) 129{ 130 // 接受一个入参 131 size_t argc = 1; 132 napi_value args[1] = {nullptr}; 133 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 134 135 // 调用napi_is_date接口判断给定入参是否为Date数据 136 bool result = false; 137 napi_status status = napi_is_date(env, args[0], &result); 138 if (status != napi_ok) { 139 napi_throw_error(env, nullptr, "Node-API napi_is_date fail"); 140 return nullptr; 141 } 142 // 将结果转成napi_value类型返回 143 napi_value returnValue = nullptr; 144 napi_get_boolean(env, result, &returnValue); 145 146 return returnValue; 147} 148``` 149 150接口声明 151 152```ts 153// index.d.ts 154export const isDate: <T>(date: T) => boolean | void; 155``` 156 157ArkTS侧示例代码 158 159```ts 160import hilog from '@ohos.hilog' 161import testNapi from 'libentry.so' 162try { 163 let now: Date = new Date(); 164 let date = "123"; 165 hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_date: %{public}s', testNapi.isDate(now)); 166 hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_date: %{public}s', testNapi.isDate(date)); 167} catch (error) { 168 hilog.error(0x0000, 'testTag', 'Test Node-API napi_is_date error: %{public}s', error.message); 169} 170``` 171 172以上代码如果要在native cpp中打印日志,需在CMakeLists.txt文件中添加以下配置信息(并添加头文件:#include "hilog/log.h"): 173 174```text 175// CMakeLists.txt 176add_definitions( "-DLOG_DOMAIN=0xd0d0" ) 177add_definitions( "-DLOG_TAG=\"testTag\"" ) 178target_link_libraries(entry PUBLIC libhilog_ndk.z.so) 179``` 180