将24小时制转换为12小时制,并增加6小时

时间:2016-11-10 22:55:54

标签: vba excel-vba date datetime time

我有无限的行,并指定了一个列来定义日期和时间,如下所示'General Format'“2016.08.10 06:00:00.066”。我知道您无法转换此列中的每个单元格“mm / dd / yyyy hh:mm:ss.000 AM / PM”。因此,我将单个列分配给“mm / dd / yyyy”,将另一列分配给“hh:mm:ss.000 AM / PM”。目前时间也落后了6个小时,所以我想增加6个小时。 我正在努力解决这个问题,因为虽然单元格是一般的或文本格式,但时间和日期显示为“yyyy.mm.dd hh:mm:ss.000”。并且找不到以这种格式拆分两种方法的方法 任何帮助表示赞赏

3 个答案:

答案 0 :(得分:1)

要将文本转换为Excel将更改为数据/时间的格式,请使用以下命令:

=--SUBSTITUTE(SUBSTITUTE(A1,".","/",1),".","/",1)

然后添加6小时,您将使用:

+ TIME(6,0,0)

所以要获得日期/时间是:

=--SUBSTITUTE(SUBSTITUTE(A1,".","/",1),".","/",1) + TIME(6,0,0)

然后简单地格式化新单元格:

mm/dd/yyyy hh:mm:ss.000 AM/PM

您也可以将其拆分为日期和时间:

日期:

=INT(--SUBSTITUTE(SUBSTITUTE(A1,".","/",1),".","/",1) + TIME(6,0,0))

格式化mm/dd/yyyy

时间:

=MOD(--SUBSTITUTE(SUBSTITUTE(A1,".","/",1),".","/",1) + TIME(6,0,0)),1)

格式化hh:mm:ss.000 AM/PM

enter image description here

答案 1 :(得分:0)

使用text:= concatenate(text(a1,“MM”),text(a1,“DD”),text(a1,“YYYY”)对其他列执行相同操作= concatenate(text(a1,“ HH “),文本(A1,” MM “),文本(A1,” SS“)

答案 2 :(得分:0)

如果您尝试使用日期时间格式,那么Excel将会缩短毫秒数,这很奇怪。

Enum DTValues
    ReturnDate
    ReturnTime
    ReturnDateTime
End Enum

Function getDateTime(yyyymmdd_hh_mm_ss_000 As String, ReturnValue As DTValues) As Single
    Dim arr
    Dim mSecs As Single
    yyyymmdd_hh_mm_ss_000 = Replace(yyyymmdd_hh_mm_ss_000, " ", ".")
    yyyymmdd_hh_mm_ss_000 = Replace(yyyymmdd_hh_mm_ss_000, ":", ".")

    arr = Split(yyyymmdd_hh_mm_ss_000, ".")
    mSecs = arr(6) / 24 / 60 / 60 / 100

    Select Case ReturnValue
    Case ReturnDate
        getDateTime = CSng(DateSerial(arr(0), arr(1), arr(2)))
    Case ReturnTime
        getDateTime = CSng(TimeSerial(arr(3), arr(4), arr(5))) + mSecs
    Case ReturnDateTime
        getDateTime = CSng(DateSerial(arr(0), arr(1), arr(2))) + CSng(TimeSerial(arr(3), arr(4), arr(5))) + mSecs
    End Select
End Function

Sub ProcessDates()
    Const WORKSHEET_NAME = "Sheet1"
    Const FIRST_ROW = 2
    Const SOURE_COLUMN = 1
    Const DATE_COLUMN = 2
    Const TIME_COLUMN = 3

    Dim Target As Range
    Dim arDate, arTime
    Dim y As Long

    With Worksheets(WORKSHEET_NAME)
        Set Target = .Range(.Cells(FIRST_ROW, SOURE_COLUMN), .Cells(Rows.Count, SOURE_COLUMN).End(xlUp))
    End With
    arDate = Target.Value
    arTime = Target.Value

    For y = 1 To UBound(arDate)
        arDate(y) = getDateTime(arDate(y), ReturnDate)
        arTime(y) = getDateTime(arTime(y), ReturnTime)
    Next

    Target.EntireRow.Columns(DATE_COLUMN).Value = arDate
    Target.EntireRow.Columns(TIME_COLUMN).Value = arTime

End Sub