在 Java 中将字符串转换为 JSON 对象

在本教程中,我们将讨论在 Java 中如何将一个字符串转换为 JSON 对象。我们有不同的库来执行这个任务。

在 Java 中使用 JSONObject 把一个字符串转换为 JSON 对象

JSONObject 可以将一个字符串解析成一个类似 Map 的对象。它存储无序的键值对。这里使用了 JSON-java 库,通常称为 org.json,并需要 maven 依赖。我们使用的 maven 依赖关系如下。

 <!-- https://mvnrepository.com/artifact/org.json/json -->
 <dependency>
   <groupId>org.json</groupId>
   <artifactId>json</artifactId>
   <version>20201115</version>
 </dependency>

为了将 JSON 字符串解析为 JSONObject,我们将字符串传递给构造函数,如下所示。

import org.json.JSONObject;
import org.json.JSONException;
public class StringToJsonObject {
    public static void main(String[] args){
        try {
            String str = "{\"name\":\"John\",\"age\":\"30\"}";
            JSONObject jsonObject = new JSONObject(str);
            System.out.println("OBJECT : "+jsonObject.toString());
        } catch (JSONException err) {
            System.out.println("Exception : "+err.toString());
        }
    }
}

输出:

OBJECT : {"age":"30","name":"John"}

在 Java 中使用 Google Gson 将一个字符串转换为 JSON 对象

Google Gson 是一个 java 库,用于将 Java 对象序列化/反序列化为 JSON 或反之。它也可以用来将 Java 字符串转换为等价的 JSON 对象。

下面给出了这个库所需要的 maven 依赖关系。

 <dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
 </dependency>

在这段代码中,我们首先使用 GsonBuilder 调用其 create() 方法创建一个 Gson 实例。我们还可以对 builder 进行各种配置设置。如下图所示,我们使用其 setPrettyPrinting() 方法。顾名思义,它漂亮地打印 JSON 输出。

之后我们使用 Gson Object 的 fromJson 方法,将 JSON 字符串解析成 User 对象。toJson() 方法使用 Gson 将 User 对象转换回 JSON 字符串。因此,使用 Gson 库字符串 str 转换为 JSON 对象。

import com.google.gson.GsonBuilder;
import com.google.gson.JsonIOException;
import com.google.gson.Gson;
public class StringToJsonObject {
    public static void main(String[] args){
        try{
            String str = "{\"name\":\"John\", \"age\":21 , \"place\":\"Nevada\"}";
            GsonBuilder builder = new GsonBuilder();
            builder.setPrettyPrinting();
            Gson gson = builder.create();
            User user = gson.fromJson(str,User.class);
            System.out.println(user.ShowAsString());
            str= gson.toJson(user);
            System.out.println("User Object as string : "+str);
        }catch(JsonIOException err){
            System.out.println("Exception : "+err.toString());
        }
    }
}
class User {
    public String name;
    public int age;
    public String place;
    public String ShowAsString() {
         return "User ["+name+", "+ age+ ", " +place+ "]";
    }
}

输出:

User [John, 21, Nevada]
User Object as string : {
  "name": "John",
  "age": 21,
  "place": "Nevada"
}

使用 Jackson 将字符串转换为 JSON 对象

Jackson 也被称为 Java JSON 库。ObjectMapper 用于将 JSON 映射成 Java 对象或 Java 对象映射成 JSON。该库使用的 maven 依赖关系如下图所示。

 <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.11.3</version>
  </dependency>

Jackson 有一个内置的树型模型来表示 JSON 对象。JsonNode 是表示树模型的类。ObjectMapper 实例 mapper 调用 readTree() 将 JSON 解析成 JsonNode 树模型。

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class StringToJsonObject {
    public static void main(String[] args){
        String json_str = "{\"name\":\"John\", \"age\":21 , \"place\":\"Nevada\"}";
        ObjectMapper mapper = new ObjectMapper();
        try {
            JsonNode node = mapper.readTree(json_str);
            String name = node.get("name").asText();
            String place = node.get("age").asText();
            System.out.println("node"+node);
            System.out.println("name: "+name +", place: "+place);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

输出:

node{"name":"John","age":21,"place":"Nevada"}
name: John, place: 21

在 Java 中将字符串转为布尔值

今天,我们将看三个方法,帮助我们将一个 Java 字符串转换为布尔值。我们可以用一个原始 booleanBoolean 对象一起使用。虽然 Boolean 类封装了基元 boolean,但我们将在下面的例子中看到这两种情况。

在 Java 中使用 Boolean.parseBoolean(string) 将一个字符串转换为 booleanBoolean

第一个例子使用 Boolean 类的 parseBoolean(string) 方法。它直接解析或转换一个给定的字符串,返回一个代表该字符串的原始 boolean。需要注意的是,当传递的字符串值不是 truefalse 时,该方法将返回 false

由于我们知道 parseBoolean() 返回的是一个 boolean,我们可以将返回的值作为 boolean boolboolean boolObj,因为 boolean 类中有原始 boolean

public class StringToBoolean {
    public static void main(String[] args) {
        String exampleString = "false";
        boolean bool = Boolean.parseBoolean(exampleString);
        Boolean boolObj = Boolean.parseBoolean(exampleString);
        System.out.println("Primitive boolean: " + bool);
        System.out.println("Boolean object: " + boolObj);
    }
}

输出:

Primitive boolean: false
Boolean object: false

在 Java 中使用 Boolean.valueOf(string) 将字符串转换为 booleanBoolean

Boolean 类的另一个将字符串转换为布尔值的静态函数是 valueOf()。它将字符串作为参数,并返回一个代表该字符串的 Boolean 值。下面我们可以看到,exampleString 是以 true 作为字符串初始化的,我们把它传递给 valueOf(string) 方法。

public class StringToBoolean {
    public static void main(String[] args) {
        String exampleString = "true";
        boolean bool = Boolean.valueOf(exampleString);
        Boolean boolObj = Boolean.valueOf(exampleString);
        System.out.println("Primitive boolean: " + bool);
        System.out.println("Boolean object: " + boolObj);
    }
}

输出:

Primitive boolean: true
Boolean object: true

在 Java 中使用 BooleanUtils.toBoolean(string) 将一个字符串转换为 booleanBoolean

在上述两种方法中,如果字符串值不是 truefalse,函数总是返回 false。这个问题可以使用 apache 通用库的 BooleanUtils.toBoolean() 方法来解决。

我们在项目中使用以下依赖关系来包含该库。

 <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-lang3</artifactId>
     <version>3.11</version>
 </dependency>

在下面的例子中,我们有三个字符串。yesnotrue。为了将所有这些值转换为布尔值,我们将使用 BooleanUtils.toBoolean(string) 并将字符串作为参数传递。在输出中,我们可以看到所有的值都被正确解析。yes 被转换为 trueno 被转换为 false

import org.apache.commons.lang3.BooleanUtils;
public class StringToBoolean {
    public static void main(String[] args) {
        String exampleString = "yes";
        String exampleString1 = "no";
        String exampleString2 = "true";
        boolean bool1 = BooleanUtils.toBoolean(exampleString);
        Boolean boolObj1 = BooleanUtils.toBoolean(exampleString);
        boolean bool2 = BooleanUtils.toBoolean(exampleString1);
        Boolean boolObj2 = BooleanUtils.toBoolean(exampleString1);
        boolean bool3 = BooleanUtils.toBoolean(exampleString2);
        Boolean boolObj3 = BooleanUtils.toBoolean(exampleString2);
        System.out.println("Primitive boolean 1: " + bool1);
        System.out.println("Boolean object 1: " + boolObj1);
        System.out.println("Primitive boolean 2: " + bool2);
        System.out.println("Boolean object 2: " + boolObj2);
        System.out.println("Primitive boolean 3 : " + bool3);
        System.out.println("Boolean object 3: " + boolObj3);
    }
}

输出:

Primitive boolean 1: true
Boolean object 1: true
Primitive boolean 2: false
Boolean object 2: false
Primitive boolean 3 : true
Boolean object 3: true

在 Java 中将字符串转换为整数数组

在 Java 语言中,可以有几种方法来考虑问题陈述。

让我们首先将问题陈述分为两部分。

  1. 将一个简单的字符串转换为字符串数组。
  2. 将字符串数组转换为整数数组。

这是以上两个步骤的示意图:

在 Java 中将字符串转换为整数数组

使用 replaceAll() 方法将字符串转换为整数数组

我们可以使用 String 类的 replaceAll() 方法,该方法带有 regexreplacement 两个参数。此方法将用给定的替换值替换给定的正则表达式。在链函数的末尾,使用了 split() 方法。此方法根据给定的字符拆分字符串。

当值被拆分并收集到 String 数组中时,我们应该使用 Integer.parseInt() 函数。由于 parseInt() 方法抛出 NumberFormatException,因此该语句应放在一个 try...catch 块中,以捕获可能的异常。

下面是示例程序,演示了如何将字符串转换为 int 数组:

package stringToIntArray;
import java.util.Arrays;
public class ConvertStringToIntArray {
    public static void main(String... args) {
        String testString = "[1,2,356,678,3378]";
        String[] separatedStrings = testString.replaceAll("\\[", "")
            .replaceAll("]", "").split(",");
        int[] intArray = new int[separatedStrings.length];
        for (int i = 0; i < separatedStrings.length; i++) {
            try {
                intArray[i] = Integer.parseInt(separatedStrings[i]);
            } catch (Exception e) {
                System.out.println("Unable to parse string to int: " + e.getMessage());
            }
        }
        System.out.println(Arrays.toString(intArray));
    }
}

输出:

[1,2,356,678,3378]

如果 testString 的值为 [1,2,356,678,3378,f],它将引发异常,并且输出将如下所示。

Unable to parse string to int: For input string: "f"
[1, 2, 356, 678, 3378, 0]

使用 Java 8 流库将字符串转换为 Int 数组

在下面的程序中,首先,我们采用了 Arrays.stream() 函数。为了提供一个流,我们使用了 String 类的 substring() 方法,该方法接受第一个和最后一个索引参数。在返回的 String split() 函数上,该函数基于定界符分割给定的 String。

在流上应用了 map() 函数。此函数将任何函数作为参数并返回流。我们给出了 String 类的 trim() 函数,该函数消除了前导和后导空格。parseInt 将收到的给定字符串转换为整数。toArray() 将转换后的 int 元素转储到 Array 中。

package stringToIntArray;
import java.util.Arrays;
public class StringToIntUsingJava 8Stream {
        public static void main(String[] args) {
        String str = "[1, 2, 3, 4, 5]";
        int[] arr = Arrays.stream(str.substring(1, str.length() - 1).split(","))
                .map(String::trim).mapToInt(Integer::parseInt).toArray();
        System.out.println(Arrays.toString(arr));
    }
}

输出:

[1, 2, 3, 4, 5]

使用 StringTokenizer 和函数将字符串转换为整数数组

使用其构造函数 StringTokenizer() 实例化 StringTokenizer 对象。构造函数使用输入的 String 和定界符形成标记化的 String。同时创建一个 String 和 int 数组,其大小作为令牌化 String 中的令牌。

countTokens() 方法对令牌计数,该令牌在内部跳过定界符。hasMoreTokens() 检查令牌生成器字符串中是否存在任何令牌。nextToken() 从字符串中检索下一个标记。如果字符串中没有令牌,则此方法将引发 NoSuchElementException

迭代将 String 令牌转换为整数并收集到整数数组中。

package stringToIntArray;
import java.util.StringTokenizer;
public class StringToIntUsingStringTokenizer {
    public static void main(String[] args) {
        String testString = "[1,2,3,4]";
        StringTokenizer stk = new StringTokenizer(testString, "[,]");
        String[] strings = new String[stk.countTokens()];
        int[] integerArray = new int[stk.countTokens()];
        int i = 0;
        while (stk.hasMoreTokens()) {
            strings[i] = stk.nextToken();
            integerArray[i] = Integer.parseInt(strings[i]);
            i++;
        }
        for (int j = 0; j < integerArray.length; j++)
            System.out.println("number[" + j + "]=" + integerArray[j]);
    }
}

输出:

number[0]=1
number[1]=2
number[2]=3
number[3]=4

在 Java 中将字符串转换为十六进制

在本文中,我们将学习如何使用下面通过示例显示的四种方法将字符串转换为十六进制值。

使用 charInteger.toHexString() 数组将字符串转换为十六进制

第一种技术使用将字符串转换为 char 数组。我们首先创建一个 StringBuilder() 对象,我们用它来附加字符以创建整个十六进制值字符串。要将字符串转换为 char 数组,我们使用 toCharArray() 命令。之后,我们使用增强循环和 Integer.toHexString() 方法,该方法接受单个 char 作为参数。

函数 Integer.toHexString()char 转换为十六进制,然后我们使用 stringBuilder.append() 方法附加字符串并将其显示到输出中。

public class StringToHex {
    public static void main(String[] args) {
        String stringToConvert = "This is a string";
        convertStringToHex(stringToConvert);
    }
    private static void convertStringToHex(String str) {
        StringBuilder stringBuilder = new StringBuilder();
        char[] charArray = str.toCharArray();
        for (char c : charArray) {
            String charToHex = Integer.toHexString(c);
            stringBuilder.append(charToHex);
        }
        System.out.println("Converted Hex from String: "+stringBuilder.toString());
    }
}

输出:

Converted Hex from String: 54686973206973206120737472696e67

使用 byte 数组和字符串格式化程序将字符串转换为十六进制

在此示例中,我们首先使用 getBytes() 函数将字符串转换为字节数组 getBytesFromString。我们必须将 getBytes() 方法中的字符集作为参数传递。一旦我们获得了字节数组,我们就创建了一个 BigInteger 对象,并在构造函数中,我们传递了一个 int 值 1 和字节数组作为参数。

我们使用 String.format() 方法将 bigInteger 对象值格式化为十六进制字符串。一旦我们得到十六进制字符串,我们就打印它。

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
public class StringToHex {
    public static void main(String[] args) {
        String stringToConvert = "We have to convert this string to hex";
        convertStringToHex(stringToConvert);
    }
    private static void convertStringToHex(String str) {
        byte[] getBytesFromString = str.getBytes(StandardCharsets.UTF_8);
        BigInteger bigInteger = new BigInteger(1, getBytesFromString);
        String convertedResult = String.format("%x", bigInteger);
        System.out.println("Converted Hex from String: " + convertedResult);
    }
}

输出:

Converted Hex from String: 5765206861766520746f20636f6e76657274207468697320737472696e6720746f20686578

使用 Apache Commons Codec 将字符串转换为十六进制

在将字符串转换为十六进制 Java 的最后一种方法中,我们使用了 Apache Commons Codec 库。要将库包含在我们的项目中,我们将使用以下 maven 依赖项:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>

与上一个示例一样,我们将从要在此程序中转换的字符串中获取一个 byte 数组。然后我们使用 Apache Commons-Codec 库的 Hex 类并调用其静态方法 encodeHexString() 并传递 byteArray 作为其参数。然后我们得到转换为十六进制的字符串作为回报。

我们可以使用函数 encodeHex() 代替 encodeHexString(),但它会返回一个 char 数组,我们必须将其转换为字符串;然而,结果将是相同的。

import org.apache.commons.codec.binary.Hex;
import java.nio.charset.StandardCharsets;
public class StringToHex {
    public static void main(String[] args) {
        String stringToConvert = "We have to convert this string to hex";
        convertStringToHex(stringToConvert);
    }
    private static void convertStringToHex(String str) {
        byte[] byteArray = str.getBytes(StandardCharsets.UTF_8);
        String convertedResult = Hex.encodeHexString(byteArray);
        System.out.println("Converted Hex from String: " + convertedResult);
    }
}

输出:

Converted Hex from String: 5765206861766520746f20636f6e76657274207468697320737472696e6720746f20686578

在 JavaScript 中将字符串转换为数组

我们将介绍 JavaScript 中将字符串转换为数组的三种方法。我们将转换如何将字符串转换为数值数组以及转换为字符串数组。

使用 JSON.parse() 表达式将字符串转换为数组

JSON.parse() 表达式用于将从 Web 服务器接收到的数据解析为对象和数组。如果接收到的数据是 JSON 对象的形式,它会将其转换为 JavaScript 对象。而且,如果数据是从数组派生的 JSON 值,JSON.parse() 会将数据转换为 JavaScript 数组。我们可以使用 JSON.parse() 将逗号分隔的数字字符串转换为数组。我们可以将括号与字符串连接起来,将其转换为数字数组。

例如,创建一个变量 data 并将值 0,1,2,3 作为字符串存储在变量中。在 data 变量上使用 JSON.parse() 并连接变量前后的左括号和右括号。将表达式存储在变量 arr 中。然后,在控制台中记录变量。此外,在控制台中记录 typeof 数组的第一个元素。

在下面的示例中,我们将一串数字转换为一组数字。我们可以使用 typeof 关键字知道数组项的类型。输出部分显示数组元素属于 number 类型。

示例代码:

var data = "0,1,2,3";
var arr = JSON.parse("[" + data + "]");
console.log( arr)
console.log(typeof arr[0])

输出:

(4) [0, 1, 2, 3]
number

使用 Array.from() 表达式将字符串转换为数组

Array.from() 方法允许你从特定长度的字符串创建数组。我们可以将需要转换的字符串传入方法中,方法将其转换为字符串数组。但是,如果我们有 .,这种方法没有帮助。在字符串之间,因为它还会将 , 添加到字符串数组中。

例如,创建一个变量 num 并将值 1234 作为字符串存储在变量中。使用对象 Array 调用 from() 方法并提供 num 变量作为函数中的参数。将表达式存储在变量 arr 中。然后,使用 console.log() 在控制台中显示变量。此外,在控制台中记录 typeof 数组的第一个元素。

下面的示例将数字字符串转换为字符串数组。字符串的每个字符都被转换为数组的字符串元素。输出部分显示数组元素是 string 类型。

示例代码:

var num = "1234";
var arr = Array.from(data);
console.log(arr)
console.log(typeof arr[0])

输出:

(4) ["1", "2", "3", "4"]
string

使用 ... 扩展运算符将字符串转换为数组

展开运算符由三个点表示,后跟变量 ...data。它是一个广泛使用的 ES6 函数。此方法将字符串转换为字符串数组。但是,如果我们在字符串之间使用逗号,则此方法没有用,因为它还会将 , 添加到字符串数组中。我们可以传递包含大括号内字符串的变量。在变量之前,我们可以添加三个点。即 [...data]

例如,将值 1234 作为字符串存储在变量 data 中。将变量 data 写入括号内并在其前添加三个点。将此表达式存储在变量 arr 中。然后,在控制台中记录变量。此外,在数组的第一个元素之前使用 typeof 关键字并将其登录到控制台。

在示例中,我们将一串数字转换为一个字符串数组,就像第二种方法一样。但是,这一次,我们使用了扩展运算符。输出部分显示数组元素是 string 类型。

示例代码:

var data = "1234";
var arr = [...data];
console.log(arr)
console.log(typeof arr[0])

输出:

(4) ["1", "2", "3", "4"]
string

在 JavaScript 中将字符串转换为标题大小写

在 JavaScript 中有 toLowerCase()toUpperCase()capitalize() 属性来与字符串交互。但是没有明确的属性可以将句子或字符串转换为标题大小写。

因此,在下面的示例中,我们将看到如何快速有效地完成任务。在这里,我们将讨论将字符串转换为标题大小写的 3 种方法。

在第一种情况下,我们将用空格分割字符串单词,然后启动一个循环工作来抓取每个要转换的单词。以下示例将使用 map 执行。

我们还将在我们的地图中使用 replace 方法。

用 JavaScript 中的 for 循环对一个字符串进行标题处理

在处理每个字符串单词之前,我们必须逐字执行转换。在这种情况下,我们将通过空格使用 split() 方法,单词将被收集为一个数组。

此外,在此之前,我们将使用 toLowerCase() 属性将所有字符转换为通用格式。

在下一步中,我们将考虑每个数组元素的一个单词来对初始字符进行 toUpperCase 操作,并对后面的字符进行切片。

因此将完全转换字符串,最后,我们将加入它们并将它们打印为单个字符串

代码片段:

function titleCase(str) {
  str = str.toLowerCase().split(' ');
  for (var i = 0; i < str.length; i++) {
    str[i] = str[i].charAt(0).toUpperCase() + str[i].slice(1);
  }
  return str.join(' ');
}
console.log(titleCase("hello pumpkin pumpkin you my hello honey bunny!"));

输出:

在 JavaScript 中将字符串转换为标题大小写

在 JavaScript 中使用 map 方法对一个字符串进行标题处理

我们的实例将从字符串中获取每个数组元素并在此处执行转换操作。

与前面的示例类似,我们将选择要转换为大写的初始字符并对其余部分进行分割。

代码片段:

function titleCase(str) {
  return str.toLowerCase().split(' ').map(function(word) {
    return (word.charAt(0).toUpperCase() + word.slice(1));
  }).join(' ');
}
console.log(titleCase("you gone MAD?"));

输出:

在 JavaScript 中将字符串转换为标题大小写

如你所见,在映射每个 word 后,我们使用 charAt() 定位第一个字母,并将该单词与以下字符合并。

在 JavaScript 中使用 replace() 方法对字符串进行标题标题处理

在这种情况下,我们将定位每个单词的首字母并将它们转换为大写。在转换时,我们将使用 replace() 方法并将更改后的字符设置为原始位置。

代码片段:

function titleCase(str) {
  return str.toLowerCase().split(' ').map(function(word) {
    return word.replace(word[0], word[0].toUpperCase());
  }).join(' ');
}
console.log(titleCase("i'm just appreciating hoho!"));

输出:

在 JavaScript 中将字符串转换为标题大小写.

在 JavaScript 中将字符串转换为日期

有时需要将字符串转换为日期格式。该字符串可以是作为字符串存储在数据库中的日期值,也可以是从 API 返回的值。无论哪种情况,都不能在日期选择器或输入类型 date 中直接使用此字符串值。因此,需要将字符串转换为日期对象才能在 HTML UI 中显示。由于采用字符串格式,因此无法执行特定于日期的操作。因此,我们需要将字符串转换为日期对象。在这里,我们列出了几种将字符串转换为日期的方法:

  • new Date()
  • Date.parse()
  • 拆分并转换为日期

在 JavaScript 中使用 new Date() 函数将字符串转换为日期

将字符串转换为日期的最常用方法是使用 new Date() 函数。new Date() 接受下面描述的各种形式的参数,但是返回一个日期对象。

  1. 没有参数作为参数。如果未将任何参数传递给 new Date() 函数,则 new Date() 将返回当前系统日期和时间,包括本地系统时间中的时区信息。
  2. 传递日期对象作为参数。new Date() 将返回一个日期对象,如作为参数传递的日期字符串所示。
  3. 传递字符串日期。new Date('2018-12-3') 函数最有趣的部分是,它可以将以字符串格式传递的日期作为参数转换为日期格式。我们将对此进行详细讨论。

将字符串日期作为参数传递

当我们以字符串格式将日期传递给 new Date() 时,它将转换为日期对象。字符串格式必须为 ISO 8601格式 – YYYY-MM-DD,才能正常使用。此方法可能无法将其他日期格式转换为日期对象。例如,参考以下代码:

new Date("2021-05-23");
new Date("2020/2/29");
new Date("2020-14-03");
new Date("14-02-2021");

输出:

Sun May 23 2021 05:30:00 GMT+0530 (India Standard Time)
Sat Feb 29 2020 00:00:00 GMT+0530 (India Standard Time)
Invalid Date
Invalid Date

从上面的示例中可以看到,日期唯一接受的字符串格式是 2021-05-232020/2/29new Date() 函数可以处理格式为 YYYY-MM-DDYYYY/MM/DD 的字符串。如果我们使用的其他字符串格式不符合 ISO 8601 标准,则 new Date() 将无法解析日期,并将返回为 Invalid date

备注

  • new Date() 仅可用于将符合 ISO 8601 格式 YYYY-MM-DD hh:mm:ss 的字符串转换为日期。
  • 对于 new Date() 无法理解的其他格式,最好将字符串拆分并将其作为参数传递给 new Date(),如本文中后续所介绍。
  • new Date() 也可以转换格式为 01 Mar 2020 12:30 或什至 MM DD YYYY HH:mm 的字符串。如果我们使用从后端通过 API 传递的值进行转换,则应确保传递的格式符合 new Date() 函数所理解的,最好检查 new Date() 返回有效的日期对象。否则,代码可能会中断。

在 JavaScript 中使用 Date.parse() 函数将字符串转换为日期

Date.parse() 是转换字符串日期的备选方案。它返回一个数字值而不是日期对象。因此,如果你希望使用日期对象,则需要进一步处理。它将解析的日期转换为一个数字,该数字表示自 1970 年 1 月 1 日午夜以来经过的毫秒数。它类似于时间戳格式,区别在于 Date.parse() 返回毫秒值,而不是秒。

Date.parse("2020-11-21")
Date.parse("2019-01-01T12:30:00.000Z")
Date.parse("20-11-2021")
Date.parse("11-20-2021")

输出:

1605916800000
1546345800000
NaN
1637346600000

值得注意的是,在可以接受的输入值类型方面,Date.parse()new Date() 相同,但是可以更好地手动检查日期是否为有效格式。这样的方法非常有用,特别是当我们处理 API 响应值时。在这种情况下,我们可能需要执行检查以确保后端返回的值符合 Date.parse()new Date() 函数所接受的日期格式。只需执行 isNaN() 检查,即可帮助识别并安全地使用日期转换方法。

let stringsFromAPI = ["2020-11-21", "20-11-2021"];
stringsFromAPI.forEach( (d) => {
    if (!isNaN(Date.parse(d))) {
        console.log(new Date(d));
    }
})

输出:

Sat Nov 21 2020 05:30:00 GMT+0530 (India Standard Time)

请注意,此处的日期 20-11-2021 的格式为 DD-MM-YYYY。因此,Date.parse() 函数或 new Date() 函数将无法理解它。因此,如果 stringsFromAPI 是来自后端的值,则上述函数将仅转换那些符合可接受格式的日期。!isNaN(Date.parse(d)) 静默拒绝不正确的日期值,并记录成功转换的值。

备注

  • Date.parse()new Date() 相似,但返回类型不同,这使得它适合检查日期值的格式是否正确,还可以通过使用来分配日期 dateObj.setTime(Date.parse(DateString))
  • 与 Unix 时间戳相比,Date.parse() 返回的毫秒数可用于对日期进行精确比较,即使不使用 new Date() 将其转换为实际的日期对象也是如此。
  • Date.parse() 内部使用 new Date() 进行日期解析,因此 Date.parse() 函数也支持 new Date() 函数接受的格式。

在 JavaScript 中拆分字符串并将其转换为日期

Date.parse()new Date() 函数都是基于 ISO 8601 扩展日期格式设计的。有时,如果日期不符合预期的格式,我们将不得不通过拆分日期字符串,提取值并将其转换为日期对象来手动进行计算。令人惊讶的是,new Date() 还支持将 date 参数作为参数传递,并且我们将 date 对象作为输出。

根据参数创建日期的语法:

new Date(yearValue, IndexOfMonth, dayValue, hours, minutes, seconds)

其中,

  • yearValue:应符合 ISO 8061 YYYY 格式。例如 2021。如果我们以 YY 格式指定一个值,它将会被错误地接受。例如,仅将 2021 提到 21 会被认为是 1921 年而不是 2021 年。
  • IndexOfMonth:从索引 0 开始。因此,从 Month 值中减去 1。例如,对于 3 月,该值为 3,但 monthIndex 将为 2(即 3-1 = 2)。本月指数通常应在 0-11 范围内
  • dayValue:表示一个月中的某天。它应在 1-31 范围内,具体取决于一个月中的天数。例如:对于 21-05-2021,日期值为 21
  • hours:一天中的小时。例如 10 点。
  • minutes:过去一个小时的分钟数
  • seconds:保留超过一分钟的秒数。

以下是一个函数,该函数采用具有自定义日期格式的字符串-DD-MM-YYYYTHH:mm:SS,并返回一个日期对象。

function convertFromStringToDate(responseDate) {
    let dateComponents = responseDate.split('T');
    let datePieces = dateComponents[0].split("-");
    let timePieces = dateComponents[1].split(":");
    return(new Date(datePieces[2], (datePieces[1] - 1), datePieces[0],
                         timePieces[0], timePieces[1], timePieces[2]))
}
convertFromStringToDate("21-03-2020T11:20:30")

输出:

Sat Mar 21 2020 11:20:30 GMT+0530 (India Standard Time)

结论

只要字符串符合 ISO 8601 格式,最常用的 new Date() 函数对于将字符串日期转换为日期对象非常有用。与 new Date() 相比,Date.parse() 函数的不同之处在于,它返回一个数值,该数值包含自 1970 年 1 月 1 日以来经过的毫秒数,该毫秒数直到作为字符串参数传递的日期为止已经过去了。通过分割日期字符串并将日期组成部分作为参数传递给 new Date() 函数,可以转换不同的日期格式。