使用JSVM-API接口进行Date相关开发
======================

#### 简介

JSVM-API中date相关接口用于处理JavaScript Date对象，并在JSVM模块和JavaScript代码之间进行日期数据的转换和处理。这对于在JSVM模块中处理时间和日期相关逻辑非常有用。

#### 基本概念

在JSVM-API中，JavaScript Date对象的数据表示从UTC时间1970年1月1日0时0分0秒起至现在的总毫秒数。

JavaScript Date对象在JavaScript中用于表示和操作日期和时间。它们允许开发者创建表示特定时刻的日期对象，执行日期和时间计算（如添加或减去时间间隔），以及格式化日期为字符串以供显示。

在JSVM-API中，通过提供与Date对象交互的函数，JSVM模块能够更紧密地与JavaScript环境集成，执行复杂的日期和时间相关操作。

#### 接口说明

| 接口 | 功能说明 |
| :-- | :-- |
| OH\_JSVM\_CreateDate | 创建一个表示给定毫秒数的Date对象。 |
| OH\_JSVM\_GetDateValue | 获取给定JavaScript Date的时间值的Double基础类型值。 |
| OH\_JSVM\_IsDate | 判断一个JavaScript对象是否为Date类型对象。 |

#### 使用示例

JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/use-jsvm-process)，本文仅展示接口对应C++相关代码。

#### \[h2\]OH\_JSVM\_CreateDate

创建一个表示给定毫秒数的Date对象。

cpp部分代码：

#include <time.h>
// OH\_JSVM\_CreateDate的样例方法
static JSVM\_Value CreateDate(JSVM\_Env env, JSVM\_CallbackInfo info) {
    // 通过c接口获取Unix纪元以来经过的秒数，并转化为毫秒数为单位
    double value = static\_cast<double>(static\_cast<uint64\_t>(time(NULL)) \* 1000ULL);
    // 调用OH\_JSVM\_CreateDate接口将double值转换成表示日期时间的JavaScript值返回出去
    JSVM\_Value returnValue = nullptr;

    JSVM\_CALL(OH\_JSVM\_CreateDate(env, value, &returnValue));

    bool isDate = false;
    JSVM\_CALL(OH\_JSVM\_IsDate(env, returnValue, &isDate));
    if (!isDate) {
        OH\_LOG\_ERROR(LOG\_APP, "JSVM IsDate fail");
        return returnValue;
    }

    value = 0;
    JSVM\_CALL(OH\_JSVM\_GetDateValue(env, returnValue, &value));

    uint64\_t time = static\_cast<uint64\_t>(value) / 1000;
    char \*date = ctime(reinterpret\_cast<time\_t \*>(&time));
    OH\_LOG\_INFO(LOG\_APP, "JSVM CreateDate success:%{public}s", date);

    return returnValue;
}

// CreateDate注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = CreateDate},
};
static JSVM\_CallbackStruct \*method = param;
// CreateDate方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"createDate", nullptr, method, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(createDate())JS";

预期结果：

JSVM CreateDate success:Mon Jul 7 10:42:34 2025

#### \[h2\]OH\_JSVM\_GetDateValue

获取给定JavaScript Date的时间值的Double基础类型值。

cpp部分代码：

#include <ctime>
// OH\_JSVM\_GetDateValue的样例方法
static JSVM\_Value GetDateValue(JSVM\_Env env, JSVM\_CallbackInfo info) {
    size\_t argc = 1;
    JSVM\_Value args\[1\] = {nullptr};
    JSVM\_CALL(OH\_JSVM\_GetCbInfo(env, info, &argc, args, nullptr, nullptr));
    // 获取传入的Unix Time Stamp时间
    double value = 0;
    JSVM\_CALL(OH\_JSVM\_GetDateValue(env, args\[0\], &value));
   
    // 将获取到的Unix Time Stamp时间转化为日期字符串打印
    uint64\_t time = static\_cast<uint64\_t>(value) / 1000;
    char \*date = ctime(reinterpret\_cast<time\_t \*>(&time));
    OH\_LOG\_INFO(LOG\_APP, "JSVM GetDateValue success:%{public}s", date);
   
    JSVM\_Value returnValue = nullptr;
    JSVM\_CALL(OH\_JSVM\_CreateDouble(env, value, &returnValue));
    return returnValue;
}

// CreateDate注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = GetDateValue},
};
static JSVM\_CallbackStruct \*method = param;
// CreateDate方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"getDateValue", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(getDateValue(new Date(Date.now())))JS";

预期结果：

JSVM GetDateValue success:Mon Jul 7 10:47:08 2025

#### \[h2\]OH\_JSVM\_IsDate

判断一个JavaScript对象是否为Date类型对象。

cpp部分代码：

// OH\_JSVM\_IsDate的样例方法
static JSVM\_Value IsDate(JSVM\_Env env, JSVM\_CallbackInfo info) {
    size\_t argc = 1;
    JSVM\_Value args\[1\] = {nullptr};
    JSVM\_CALL(OH\_JSVM\_GetCbInfo(env, info, &argc, args, nullptr, nullptr));
    bool isDate = false;
    JSVM\_CALL(OH\_JSVM\_IsDate(env, args\[0\], &isDate));
    OH\_LOG\_INFO(LOG\_APP, "JSVM IsDate success:%{public}d", isDate);
    
    JSVM\_Value result = nullptr;
    JSVM\_CALL(OH\_JSVM\_GetBoolean(env, isDate, &result));
    return result;
}
// CreateDate注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = IsDate},
};
static JSVM\_CallbackStruct \*method = param;
// CreateDate方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"isDate", nullptr, method, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(isDate(new Date(Date.now())))JS";

预期结果：

JSVM IsDate success:1