1# 使用JSVM-API接口进行Date相关开发
2
3## 简介
4
5JSVM-API中date相关接口用于处理JavaScript Date对象,并在JSVM模块和JavaScript代码之间进行日期数据的转换和处理。这对于在JSVM模块中处理时间和日期相关逻辑非常有用。
6
7## 基本概念
8
9在JSVM-API中,JavaScript Date对象的数据表示从UTC时间1970年1月1日0时0分0秒起至现在的总毫秒数。
10
11JavaScript Date对象提供了一种在JavaScript中表示和操作日期和时间的方式。它们允许您创建表示特定时刻的日期对象,执行各种日期和时间相关的计算(如添加或减去时间间隔),以及格式化日期为字符串以供显示。
12
13在JSVM-API中,通过提供与Date对象交互的函数,JSVM模块能够更紧密地与JavaScript环境集成,执行更复杂的日期和时间相关操作。
14
15## 接口说明
16
17| 接口                       | 功能说明                       |
18|----------------------------|--------------------------------|
19| OH_JSVM_CreateDate           | 创建了一个表示给定毫秒数的Date对象。  |
20| OH_JSVM_GetDateValue        | 获取给定JavaScript Date的时间值的Double基础类型值。  |
21| OH_JSVM_IsDate               | 判断一个JavaScript对象是否为Date类型对象。|
22
23## 使用示例
24
25JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](use-jsvm-process.md),本文仅对接口对应C++相关代码进行展示。
26
27### OH_JSVM_CreateDate
28
29创建一个表示给定毫秒数的Date对象。
30
31cpp部分代码
32
33```cpp
34#include <time.h>
35// OH_JSVM_CreateDate的样例方法
36static JSVM_Value CreateDate(JSVM_Env env, JSVM_CallbackInfo info) {
37    // 通过c接口获取Unix纪元以来经过的秒数,并转化为毫秒数为单位
38    double value = static_cast<double>(time(NULL) * 1000);
39    // 调用OH_JSVM_CreateDate接口将double值转换成表示日期时间的JavaScript值返回出去
40    JSVM_Value returnValue = nullptr;
41
42    JSVM_CALL(OH_JSVM_CreateDate(env, value, &returnValue));
43
44    bool isDate;
45    JSVM_CALL(OH_JSVM_IsDate(env, returnValue, &isDate));
46    if (isDate == false) {
47        OH_LOG_ERROR(LOG_APP, "JSVM IsDate fail");
48        return returnValue;
49    }
50
51    value = 0;
52    JSVM_CALL(OH_JSVM_GetDateValue(env, returnValue, &value));
53
54    uint64_t time = static_cast<uint64_t>(value) / 1000;
55    char *date = ctime(reinterpret_cast<time_t *>(&time));
56    OH_LOG_INFO(LOG_APP, "JSVM CreateDate success:%{public}s", date);
57
58    return returnValue;
59}
60
61// CreateDate注册回调
62static JSVM_CallbackStruct param[] = {
63    {.data = nullptr, .callback = CreateDate},
64};
65static JSVM_CallbackStruct *method = param;
66// CreateDate方法别名,供JS调用
67static JSVM_PropertyDescriptor descriptor[] = {
68    {"createDate", nullptr, method, nullptr, nullptr, nullptr, JSVM_DEFAULT},
69};
70// 样例测试js
71const char *srcCallNative = R"JS(createDate())JS";
72```
73
74### OH_JSVM_GetDateValue
75
76获取给定JavaScript Date的时间值的Double基础类型值。
77
78cpp部分代码
79
80```cpp
81#include <time.h>
82// OH_JSVM_GetDateValue的样例方法
83static JSVM_Value GetDateValue(JSVM_Env env, JSVM_CallbackInfo info) {
84    size_t argc = 1;
85    JSVM_Value args[1] = {nullptr};
86    JSVM_CALL(OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr));
87    // 获取传入的Unix Time Stamp时间
88    double value;
89    JSVM_CALL(OH_JSVM_GetDateValue(env, args[0], &value));
90
91    // 将获取到的Unix Time Stamp时间转化为日期字符串打印
92    uint64_t time = static_cast<uint64_t>(value) / 1000;
93    char *date = ctime(reinterpret_cast<time_t *>(&time));
94    OH_LOG_INFO(LOG_APP, "JSVM GetDateValue success:%{public}s", date);
95
96    JSVM_Value returnValue = nullptr;
97    JSVM_CALL(OH_JSVM_CreateDouble(env, value, &returnValue));
98    return returnValue;
99}
100
101// CreateDate注册回调
102static JSVM_CallbackStruct param[] = {
103    {.data = nullptr, .callback = GetDateValue},
104};
105static JSVM_CallbackStruct *method = param;
106// CreateDate方法别名,供JS调用
107static JSVM_PropertyDescriptor descriptor[] = {
108    {"getDateValue", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
109};
110// 样例测试js
111const char *srcCallNative = R"JS(getDateValue(new Date(Date.now())))JS";
112```
113
114### OH_JSVM_IsDate
115
116判断一个JavaScript对象是否为Date类型对象。
117
118cpp部分代码
119
120```cpp
121// OH_JSVM_IsDate的样例方法
122static JSVM_Value IsDate(JSVM_Env env, JSVM_CallbackInfo info) {
123    size_t argc = 1;
124    JSVM_Value args[1] = {nullptr};
125    JSVM_CALL(OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr));
126    bool isData;
127    JSVM_CALL(OH_JSVM_IsDate(env, args[0], &isData));
128    OH_LOG_INFO(LOG_APP, "JSVM IsDate success:%{public}d", isData);
129
130    JSVM_Value result = nullptr;
131    JSVM_CALL(OH_JSVM_GetBoolean(env, isData, &result));
132    return result;
133}
134// CreateDate注册回调
135static JSVM_CallbackStruct param[] = {
136    {.data = nullptr, .callback = IsDate},
137};
138static JSVM_CallbackStruct *method = param;
139// CreateDate方法别名,供JS调用
140static JSVM_PropertyDescriptor descriptor[] = {
141    {"isDate", nullptr, method, nullptr, nullptr, nullptr, JSVM_DEFAULT},
142};
143// 样例测试js
144const char *srcCallNative = R"JS(isDate(new Date(Date.now())))JS";
145```
146