16

我需要将日期格式化为特定的字符串。

我使用SimpleDateFormat类使用模式“”来格式化日期,yyyy-MM-dd'T'HH:mm:ssZ它将当前日期返回为
2013-01-04T15:51:45+0530”,但我需要作为
2013-01-04T15:51:45+05:30”。

下面是使用的编码,

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);      
Log.e(C.TAG, "formatted string: "+sdf.format(c.getTime()));

输出:格式化字符串:2013-01-04T15:51:45+0530

我需要的格式2013-01-04T15:51:45+05:30只是在 gmt 时间之间添加冒号。

因为我正在使用 Google 日历来插入事件,所以它只接受我提到的所需格式。

4

10 回答 10

33

您还可以在模式中使用“ZZZZZ”而不是“Z”(根据文档)。像这样的东西

    Calendar c = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.ENGLISH);      
    Log.e(C.TAG, "formatted string: "+sdf.format(c.getTime()));
于 2015-08-05T11:03:07.203 回答
14

您可以改用Joda Time。它DateTimeFormat有一个ZZ格式属性,可以满足您的需求。

关联

大优势:不像SimpleDateFormat,DateTimeFormatter是线程安全的。用法:

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ")
    .withLocale(Locale.ENGLISH);
于 2013-01-04T12:53:22.443 回答
2

tl;博士

您可以使用该模式yyyy-MM-dd'T'HH:mm:ssXXX来获得所需的输出。

java.time

日期时间 APIjava.util及其格式化 APISimpleDateFormat已过时且容易出错。建议完全停止使用它们并切换到现代日期时间 API

使用现代日期时间 API:

构建一个包含日期、时间和时区偏移信息并对其进行格式化的对象:

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = OffsetDateTime.of(LocalDate.of(2013, 1, 4), LocalTime.of(15, 51, 45),
                ZoneOffset.ofHoursMinutes(5, 30));

        // Print the default format i.e. the string returned by OffsetDateTime#toString
        System.out.println(odt);

        // Custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        System.out.println(dtf.format(odt));
    }
}

输出:

2013-01-04T15:51:45+05:30
2013-01-04T15:51:45+05:30

如您所见,默认格式的输出和使用 a 的输出DateTimeFormatter是相同的。但是,这里有一个问题:如果是,则省略秒和秒的小数部分,即如果上面代码中的时间是,则默认格式的输出将是。如果您需要像这次这样的字符串,则必须使用带有所需模式的 a 。OffsetDateTime#toString 0LocalTime.of(15, 0, 0)2013-01-04T15:00+05:302013-01-04T15:00:00+05:30DateTimeFormatter

解析和格式化:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtfForInputString = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
        OffsetDateTime odt = OffsetDateTime.parse("2013-01-04T15:51:45+0530", dtfForInputString);

        // Print the default format i.e. the string returned by OffsetDateTime#toString
        System.out.println(odt);

        // Custom format
        DateTimeFormatter dtfCustomOutput = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        System.out.println(dtfCustomOutput.format(odt));
    }
}

输出:

2013-01-04T15:51:45+05:30
2013-01-04T15:51:45+05:30

使用旧版 API:

为给定的时区偏移量构建一个日期时间对象并对其进行格式化:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+05:30"));
        calendar.set(2013, 0, 4, 15, 51, 45);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
        Date date = calendar.getTime();
        System.out.println(sdf.format(date));
    }
}

输出:

2013-01-04T15:51:45+05:30

该类Calendar使用UTC(或GMT)作为其默认时区,因此,除非您使用它指定时区,否则它将java.util.Date返回UTC.

同样,SimpleDateFormat该类也UTC用作其默认时区,因此,除非您使用它指定时区,否则它将String返回UTC.

解析和格式化:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdfForInputString = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
        Date date = sdfForInputString.parse("2013-01-04T15:51:45+0530");

        SimpleDateFormat sdfCustomOutput = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        sdfCustomOutput.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
        System.out.println(sdfCustomOutput.format(date));
    }
}

输出:

2013-01-04T15:51:45+05:30
于 2021-01-13T19:27:32.177 回答
1

您可以做的只是使用 substring() 手动添加“:”。我之前遇到过这个问题,这个解决方案有效。

于 2013-01-04T12:56:31.923 回答
1

试试这个

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);   

System.out.println("formatted string: "+sdf.format(c.getTime()));

String text = sdf.format(c.getTime());  
String result = text.substring(0, 22) + ":" + text.substring(22);  
System.out.println("result = " + result);
于 2013-01-04T12:59:45.073 回答
1

为什么不直接用正则表达式手动完成呢?

String oldDate = "2013-01-04T15:51:45+0530";
String newDate = oldDate.replaceAll("(\\+\\d\\d)(\\d\\d)", "$1:$2");

相同的结果,带有子字符串(如果性能是一个问题)。

String oldDate = "2013-01-04T15:51:45+0530";
int length = oldDate.length();
String newDate = oldDate.substring(0, length - 2) + ':' + oldDate.substring(length - 2);
于 2013-01-04T13:00:33.917 回答
1

如果您想要不同时区的日期(标题建议)

  val nowMillsUTC = System.currentTimeMillis()

  val timeZoneID = "Australia/Perth"
  val tz = TimeZone.getTimeZone(timeZoneID)

  val simpleDateFormat = SimpleDateFormat("HH.mm  dd.MMM.yyyy", Locale.getDefault())
  simpleDateFormat.setTimeZone(tz)
  val resultTxt = simpleDateFormat.format(nowMillsUTC)

  print(timeZoneID + " -> " + resultTxt)
  //   Australia/Perth -> 19.59  21.Mar.2019
于 2019-03-21T12:31:33.673 回答
0

试试这个代码

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z", Locale.ENGLISH);
String s = sdf.format(c.getTime());
String fDate = s.substring(0, s.length()-2) +":"+s.substring(s.length()-2, s.length());
Log.e("check", "formatted string: "+fDate);
于 2013-01-04T13:02:07.187 回答
0

这就是我在 android Build.VERSION.SDK_INT < 26 上的做法

int offset = TimeZone.getDefault().getRawOffset();
String str_date='20:30 12-01-2021';
DateFormat formatter = new SimpleDateFormat("HH:mm dd-MM-yyy",Locale.US);
Date date = formatter.parse(str_date);
long utcTime = date.getTime() + (3600000*3);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm dd/MM/yyyy", Locale.US);
String dateStr = sdf.format(utcTime + offset);
System.out.println(dateStr);

当我的服务器使用 -3 时区发送时间时,我必须将 (3600*3) 添加到 getTime 并将其保存到 utcTime,这样 utcTime 就是 UTC。然后我将手机当前时区的偏移量添加到 utcTime。在我的情况下,因为我的时区是 -3 它的打印:

20:30 12/01/2021

但如果我改变我的时区,日期也会改变。

我已经在这里回答了: Convert UTC into Local Time on Android

于 2021-01-13T15:23:23.973 回答
-1

只需重构此代码并将“Locale.getDefault()”替换为您需要的语言环境

private SimpleDateFormat getDateFormat() {
    SimpleDateFormat dateFormat = (SimpleDateFormat) SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.DEFAULT, Locale.getDefault());
    String pattern = dateFormat.toLocalizedPattern();
    pattern = pattern.trim();
    dateFormat.applyLocalizedPattern(pattern);
    return dateFormat;
}

//这里是用法

SimpleDateFormat sdf = getDateFormat();

sdf.format(新日期());

于 2017-09-03T22:03:20.907 回答